Вверх ↑
Этот топик читают: Гость
Ответов: 1747
Рейтинг: 152
#1: 2019-07-08 19:43:06 ЛС | профиль | цитата
Add(Edit,4537472,280,154)
{
@Hint=#7:Фамилия|
Left=70
Top=10
Width=130
TabOrder=1
Ctl3D=1
Text="Иванов"
Point(onPaint)
link(onPaint,7074271:doWork2,[])
}
Add(Label,15555315,280,112)
{
@Hint=#7:Фамилия|
Left=10
Top=15
Width=56
Height=17
Color=6718159
Caption="Фамилия:"
Point(onPaint)
link(onPaint,1883189:doWork2,[])
}
Add(BitBtn,15150872,280,217)
{
Left=30
Top=40
Width=35
Height=35
Color=6718159
TabOrder=2
Hint="Добавить из базы"
Caption=""
Bitmap=[ZIP3609000078DA73F235E36400033320D600620928666450804840E591C1FFFFFFF1E2D344A82117AF009A0DC3D4367B27D4DC39507A271E3B606E9808C5C4980F0B1798DB718513CCDE3950B74C24D1AF3B89548FEC5752CC27267E91CD24D5FC3B04D423FB6F2795D3012DD3EE1D0ACCE66D58851553C35DECBDBB193CAFBE6350BEFE8FC1ECE63F86FC67FF197A9FFF6270D97597623B4066F7FCFEC710F9EA1F86F99E071F3370CC3D4F911D94987F9A401EA786FB09955520F337FFF9C7B0EDDB7F86635FFF333CFAF98FE1F56F08BDFEC96786987DF751CC07A52198BB5720950FAD38EC0099BFEBDD3706833D771904975F62109A7F9A4161D16906D3E56719D426ED679874EE09C5EEF73A7A1767F8B0356D1BD0F01FCAE99358F32702D34FD38FFF0CF9405CF5EF3F98BF0088936F7D65E05D748562F3FFFDF9C1F005C8BE0CC4A0B40AC26B816C1006D9496919C133E900D87C509A3F0E3517E4FED9BFFF3008B7AEA75A19870D936316002CFEC18C]
Point(onPaint)
link(onPaint,7074271:doWork3,[(368,230)])
}
Add(Img_Point,14270471,462,119)
{
}
Add(HubEx,1883189,364,119)
{
link(onEvent,14270471:doDraw,[])
}
Add(HubEx,7074271,364,168)
{
Angle=3
link(onEvent,1883189:doWork3,[])
}

И вот такой результат.

Что за глюки с onPaint? Так и не смог понять, что в коде (pas) не так.

ps. У светодиода (LED) OnPaint работает нормально:
Add(LED,6626431,329,336)
{
Left=30
Top=80
Width=35
Height=35
Color=6718159
Point(onClick)
Point(Handle)
Point(onPaint)
link(onClick,6626431:doChangeValue,[(373,349)(373,345)(317,345)(317,342)])
link(onPaint,8963850:doWork1,[])
}
Add(LineBreak,10385927,336,378)
{
Type=1
link(Data,6626431:Handle,[])
Primary=[895121,56,-56]
}
Add(MultiElement,8963850,392,350)
{
@Hint=#24:Знак Power на светодиоде|
link(Data1,895121:Var,[])
}
BEGIN_SDK
Add(EditMulti,6665014,21,21)
{
WorkCount=1
DataCount=1
link(doWork1,2522156:doDraw,[(42,27)(42,83)])
}
Add(Img_Ellipse,2522156,63,77)
{
Point1=655370
Point2=983055
Point2AsOffset=0
DrawSource=1
Size=2
Color=-16777208
link(onDraw,10251529:doDraw,[])
link(Bitmap,13688848:Var2,[])
}
Add(Img_Line,10251529,112,77)
{
Point1=458769
Point2=983057
DrawSource=1
Size=2
Color=-16777208
link(Bitmap,13688848:Var3,[(118,61)])
}
Add(GetDataEx,13688848,63,56)
{
link(Data,6665014:Data1,[(69,38)(27,38)])
}
END_SDK

Редактировалось 1 раз(а), последний 2019-07-08 19:43:39
карма: 5
0
файлы: 1onpaintbug.png [2KB] [446]
vip
#1.1контекстная реклама от партнеров
Ответов: 1747
Рейтинг: 152
#2: 2019-07-09 16:28:54 ЛС | профиль | цитата
Почему тишина? У остальных глюк повторяется?
карма: 5
0
Ответов: 331
Рейтинг: 6
#3: 2019-07-09 21:26:40 ЛС | профиль | цитата
У меня все нормально отображается

карма: 2

0
Разработчик
Ответов: 25466
Рейтинг: 2071
#4: 2019-07-10 12:18:44 ЛС | профиль | цитата
3042 писал(а):
Что за глюки с onPaint?

Вообще-то onPaint предполагает, что контекст будет отрисован вручную. Led же отрисовывается вручную перехватом onPaint в самом коде, а сам onPaint наружу выдается уже после отрисованного контрола, те можно дорисовать чего-либо на контексте Led.

Редактировалось 1 раз(а), последний 2019-07-10 12:19:07
карма: 19

0
Ответов: 1747
Рейтинг: 152
#5: 2019-07-10 13:20:26 ЛС | профиль | цитата
nesco писал(а):
сам onPaint наружу выдается уже после отрисованного контрола, те можно дорисовать чего-либо на контексте Led.

По-моему, так должно быть и в других компонентах, иначе просто пропадает смысл в этом событии. Если у кнопки есть OnPaint - это не значит, что она не должна отрисовываться: если мне нужно что-то отрисовать с нуля, я возьму PaintBox. Следовательно, другие компоненты должны автоматически отрисовываться, а по OnPaint уже программист добавляет свои каракули.

Я тут проверил: в Win.pas, в ф-ции SetOnPaint происходит назначение обработчика Control.OnPaint := _OnPaint;, и именно эта строчка отключает отрисовку. Что же происходит с отрисовкой?
карма: 5
0
Ответов: 3970
Рейтинг: 625
#6: 2019-07-10 14:47:33 ЛС | профиль | цитата
Вероятно, надо самому перехватывать событие WM_PAINT, передавать его дефолтной процедуре обработки сообщений, после чего самому вызывать OnPaint. Вот только я не в курсе как это согласуется с принципами работы окон Windows.

Редактировалось 1 раз(а), последний 2019-07-10 16:22:14
карма: 19

0
Ответов: 331
Рейтинг: 6
#7: 2019-07-10 16:10:52 ЛС | профиль | цитата
Вы тут спорите, я извиняюсь, а что не так, или что должно быть? По схеме не понятно, я так понял точки на Label и Edit у 3042 появляются не в тему, вот и на вопрос ответил, у меня нормально отображается. Может я первую схему не понял. Я в рисовании с вкладкой не совсем дружу просто
карма: 2

0
Ответов: 9820
Рейтинг: 340
#8: 2019-07-10 16:33:25 ЛС | профиль | цитата
3042 писал(а):
По-моему, так должно быть и в других компонентах, иначе просто пропадает смысл в этом событии

Так сделано в библиотеке (все правильно nesco сказал, просто забыл это добавить).
Можно сделать библиотеку самому. То чего предлагает Netspirit:
Netspirit писал(а):
надо самому перехватывать событие WM_PAINT, передавать его дефолтной процедуре обработки сообщений, после чего самому вызывать OnPaint

-- это и есть начало сего неблагодарного процесса.

Как-то так...

Редактировалось 1 раз(а), последний 2019-07-10 16:34:27
карма: 8

0
Ответов: 1747
Рейтинг: 152
#9: 2019-07-10 22:46:49 ЛС | профиль | цитата
Sersey писал(а):
точки на Label и Edit у 3042 появляются не в тему, вот и на вопрос ответил, у меня нормально отображается.

Точки - это точки с поля hiasm Потому что Label и Edit не отрисовываются - вот и остаётся то, что было под ними (если запустить прогу с рабочего стола - на месте Label и Edit будет кусок обоев).

--- Добавлено в 2019-07-10 22:50:36

Galkov писал(а):
То чего предлагает Netspirit:
Netspirit писал(а):
надо самому перехватывать событие WM_PAINT, передавать его дефолтной процедуре обработки сообщений, после чего самому вызывать OnPaint

-- это и есть начало сего неблагодарного процесса.

Остаётся надеяться, что хватит одной правки Win.pas - вместо назначения обработчика Control.OnPaint := _OnPaint -
Netspirit писал(а):

надо ... перехватывать событие WM_PAINT, передавать его дефолтной процедуре обработки сообщений, после чего ... вызывать OnPaint


Редактировалось 4 раз(а), последний 2019-07-10 22:54:09
карма: 5
0
Ответов: 1747
Рейтинг: 152
#10: 2019-07-19 11:36:53 ЛС | профиль | цитата
М-да, крепость остаётся неприступной.
Пробовал перехватывать событие WM_PAINT, после чего вызывать OnPaint - вроде всё работает (стандартная отрисовка + событие).
Но проблема в том, что на OnPaint должен выдаваться контекст отрисовки (hdc), а через _onMessage он не выдаётся. Этот HDC можно получить ф-цией BeginPaint, которая готовит элемент к отрисовке, но её вызов сразу блокирует стандартную отрисовку контрола.

Вот примерно так (в Win.pas):
   case Msg.message of
WM_PAINT: begin
if Msg.wParam = 0 then DC := BeginPaint(Control.Handle, PaintStruct) else DC := Msg.wParam;
if assigned(OldPaint) then OldPaint(Control, DC);
_hi_onEvent(fOnPaint, integer(DC));
if Msg.wParam = 0 then EndPaint(Control.Handle, PaintStruct);
end;
end;

Именно эта ф-ция (вместе с парной EndPaint) содержится в KOL в ф-ции WndProcPaint, которая висит в SetOnPaint. Именно на этом участке происходит блокировка.

Редактировалось 1 раз(а), последний 2019-07-19 11:37:18
карма: 5
0
Ответов: 3970
Рейтинг: 625
#11: 2019-07-19 13:40:36 ЛС | профиль | цитата
3042 писал(а):
но её вызов сразу блокирует стандартную отрисовку контрола.
Под "стандартной отрисовкой" следует понимать не вызов OldPaint, а то, что делает система, если сообщение WM_PAINT не будет обработано приложением.
То-есть, при получении WM_PAINT первым делом следует вызвать функцию DefWindowProc(), передав обработку системе - она нарисует стандартный контрол. Затем после этого уже надо сделать то, что делает KOL при вызове OnPaint. А KOL как раз не вызывает DefWindowProc() - если назначен OnPaint, значит компонент сам себя полностью рисует, что мы и пытаемся побороть. Вот только я не в курсе будет ли это работать.
карма: 19

0
Ответов: 1747
Рейтинг: 152
#12: 2019-07-19 16:56:59 ЛС | профиль | цитата
Netspirit писал(а):
Под "стандартной отрисовкой" следует понимать не вызов OldPaint, а то, что делает система, если сообщение WM_PAINT не будет обработано приложением.

Да, я так и понимаю.

   case Msg.message of
WM_PAINT: begin
DefWindowProc(Control.Handle,Msg.message,Msg.wParam,Msg.lParam);
if Msg.wParam = 0 then DC := BeginPaint(Control.Handle, PaintStruct) else DC := Msg.wParam;
if assigned(OldPaint) then OldPaint(Control, DC);
_hi_onEvent(fOnPaint, integer(DC));
if Msg.wParam = 0 then EndPaint(Control.Handle, PaintStruct);
end;
end;
Вот это не работает. DefWindowProc вообще не отрисовывает контрол, куда бы я эту строчку тут не поставил. Однако отрисовка происходит даже без DefWindowProc, если убрать BeginPaint - но тогда не получим DC.
Netspirit, можешь накидать какой-нибудь код, может, я чего не так делаю.

Редактировалось 2 раз(а), последний 2019-07-19 16:59:26
карма: 5
0
Ответов: 3970
Рейтинг: 625
#13: 2019-07-20 17:52:49 ЛС | профиль | цитата
Так нету у меня готового варината. Это были предположения для экспериментов...
карма: 19

0
Ответов: 1747
Рейтинг: 152
#14: 2019-07-22 09:31:03 ЛС | профиль | цитата
В общем, вот решение без выдачи HDC на OnPaint:

Add(InlineCode,4748460,238,413)
{
EventPoints=#77:onPaint=Происходит при необходимости отрисовать элемент, выдавая пустой поток|
DataPoints=#9:dtPHandle|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|38:uses kol,Share,Debug,messages,windows;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|23: FOldMes:TOnMessage;|61: function _onMess(var Msg:TMsg; var Rslt:Integer):Boolean;|19: procedure Work;|9: public|22: onPaint:THI_Event;|24: dtPHandle:THI_Event;|23: constructor Create;|5: end;|0:|14:implementation|0:|31:constructor THiAsmClass.Create;|5:begin|18: inherited Create;|15: InitAdd(Work);|4:end;|0:|27:procedure THiAsmClass.Work;|15:var c:PControl;|5:begin|42: c := PControl(ToIntegerEvent(dtPHandle));|30: if not assigned(c) then exit;|25: FOldMes := c.OnMessage;|24: c.OnMessage := _onMess;|4:end;|0:|29:function THiAsmClass._onMess;|5:begin|20: case Msg.message of|42: WM_PAINT: _hi_OnEvent(onPaint); //без DC|5: end;|43: Result := _hi_OnMessage(FOldMes,Msg,Rslt);|4:end;|0:|4:end.|
link(onPaint,4622620:doEvent4,[])
link(dtPHandle,6969958:PHandle,[])
}
Add(Edit,6969958,231,273)
{
Left=55
Top=55
Width=170
Font=[MS Sans Serif,8,1,0,1]
Point(PHandle)
Point(Handle)
Point(Width)
Point(Height)
Point(onMouseDown)
Point(onKeyDown)
Point(onMouseMove)
link(onMouseDown,4622620:doEvent1,[(289,293)(289,398)])
link(onKeyDown,4622620:doEvent2,[(289,300)(289,405)])
link(onMouseMove,4622620:doEvent3,[(289,307)(289,412)])
}
Add(Img_Rectangle,2605467,441,392)
{
DrawSource=1
Style=4
LineStyle=2
rX=2
rY=2
Color=8388608
BgColor=12639424
Point(Point1)
Point(Point2)
link(Bitmap,6969958:Handle,[(447,348)(251,348)])
link(Point1,14630089:Point,[])
link(Point2,16134061:Point,[])
}
Add(DeferredEvent,6057886,343,392)
{
link(onDeferredEvent,2055885:doOperation,[(419,398)(419,272)])
}
Add(PointXY,16134061,462,343)
{
link(X,2055885:Result,[])
link(Y,8176782:Result,[(475,321)(517,321)])
}
Add(Math,2055885,462,266)
{
OpType=1
Op2=4
ResultType=0
link(onResult,8176782:doOperation,[])
link(Op1,6969958:Width,[(468,254)(363,254)(363,323)(258,323)])
}
Add(Math,8176782,511,266)
{
OpType=1
Op2=4
ResultType=0
link(onResult,2605467:doDraw,[(555,272)(555,335)(429,335)(429,398)])
link(Op1,6969958:Height,[(517,254)(391,254)(391,323)(265,323)])
}
Add(PointXY,14630089,455,203)
{
}
Add(Hub,4622620,308,392)
{
InCount=4
OutCount=1
link(onEvent1,6057886:doDeferredEvent,[])
}

В общем-то, HDC особо и не нужен: мы всё равно используем Handle для рисования, но переделывать Win.pas так нельзя, поэтому - отдельный IC.

И в дополнение: как украсить стандартные элементы рисованием.


карма: 5
0
файлы: 1onpaintedit.png [513B] [217]
Ответов: 9820
Рейтинг: 340
#15: 2019-07-22 18:54:21 ЛС | профиль | цитата
3042 писал(а):
В общем-то, HDC особо и не нужен: мы всё равно используем Handle для рисования

И что же помешало Благородному Дону получить HDC так же, как мы его получаем, когда "всё равно используем Handle для рисования" ???

Редактировалось 2 раз(а), последний 2019-07-22 18:55:32
карма: 8

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)