MAV писал(а):
При тестировании при отрисовке на хендле получил мерцание, возможно сможешь найти решение. Решений тут может быть только два: синхронизация с частотой обновления кадра и\или предварительная отрисовка в буфере (двойная буферизация). В принципе, универсальный компонент синхронизации с экраном был бы много где полезен, но сейчас всё менее актуален в виду нарастающей асинхронности устройств отображения и вариативности частот. Синхронно переключать\выводить буфера ещё реально, так, собственно система и делает, AFAIK.
Если не делаем анимации, то ставим своё рисование на событие onPaint. Или рисуем в буфере, и его кажем на onPaint.
При анимации альтернативы самодельному буферу (Bitmap), боюсь, нет. В системе есть призванная помогать в этом двойная буферизация (сама делает буфер при отрисовке на элементе), но, мягко говоря, не все элементы умеют с ней нормально работать.
------------ Дoбавленo в 13.48:
MAV, иллюстрация системной двойной буферизации:
Add(MainForm,2953706,385,203)
{
Width=680
Height=462
Caption="Test All Elements GP"
Position=1
Point(Handle)
Point(onPaint)
}
Add(ChildPanelEx,7266241,385,245)
{
}
BEGIN_SDK
Add(EditMultiEx,12409977,21,21)
{
}
Add(Panel,8998479,182,231)
{
Left=35
Top=105
Align=5
Point(onPaint)
Point(Handle)
link(onPaint,13164349:doSet,[])
}
Add(GP_Curve,6405214,476,308)
{
PointsArray=#5:20;20|5:60;50|6:80;120|7:100;150|7:150;100|6:180;80|7:220;140|6:260;50|7:300;100|0:|
Canvas="myCanvas"
link(onDraw,8330977:doFor,[])
}
Add(GP_Rectangle,855326,266,308)
{
X=45
Y=45
Width=100
Hieght=100
View=2
Canvas="myCanvas"
link(onDraw,2138541:doSet,[])
}
Add(GP_Brush,8648735,224,308)
{
Type=1
Color=8421376
Color2=65535
Alpha2=100
Hatch=51
Canvas="myCanvas"
link(onSet,855326:doDraw,[])
}
Add(GP_Pen,11360173,434,308)
{
Color=8421376
Alpha=100
Size=12
CustomStylePen=[]
StartCap=8
EndCap=6
StartCapOffset=22
EndCapOffset=22
Compound=[]
Canvas="myCanvas"
link(onSet,6405214:doDraw,[])
}
Add(GP_Pen,4302817,182,308)
{
Color=255
Size=2
CustomStylePen=[]
Compound=[]
Canvas="myCanvas"
link(onSet,8648735:doSet,[])
}
Add(Counter,11517692,266,238)
{
Max=23
link(onNext,4240771:doSet,[])
}
Add(GP_Ellipse,13593300,392,308)
{
X=170
Y=45
Width=100
Hieght=100
View=2
Canvas="myCanvas"
link(onDraw,11360173:doSet,[])
}
Add(GP_Brush,9105610,350,308)
{
Type=1
Color=32896
Color2=16711680
Hatch=45
Canvas="myCanvas"
link(onSet,13593300:doDraw,[])
}
Add(GP_Pen,2138541,308,308)
{
Color=255
Size=33
CustomStylePen=[]
Compound=['0'=0,'0'=2,'0'=4,'0'=6,'0'=8,'0'=10]
Canvas="myCanvas"
link(onSet,9105610:doSet,[])
}
Add(GP_Line,2979239,616,308)
{
X1=350
X2=480
Canvas="myCanvas"
link(Y1,1891837:Var2,[])
link(Y2,1891837:Var3,[(643,292)])
}
Add(GP_Pen,9550187,574,308)
{
Color=8388608
Alpha=0
Size=12
StylePen=1
CustomStylePen=[]
DashCap=1
StartCap=8
EndCap=5
Compound=[]
Canvas="myCanvas"
link(onSet,2979239:doDraw,[])
}
Add(GP_PolyLine,1847564,665,357)
{
PointsArray=#7:100;300|7:150;250|7:200;310|7:250;270|0:|
Canvas="myCanvas"
link(onDraw,6016372:doSet,[])
}
Add(GP_Pen,4069778,623,357)
{
Color=255
Size=5
CustomStylePen=[]
Compound=[]
Canvas="myCanvas"
link(onSet,1847564:doDraw,[])
}
Add(For,8330977,525,308)
{
End=250
Step=25
link(onEvent,9550187:doSet,[])
link(onStop,7913161:doData,[(569,321)(569,363)])
}
Add(GetDataEx,1891837,623,287)
{
Angle=3
link(Data,8330977:Position,[(515,292)(515,352)(531,352)])
}
Add(GP_Polygon,12965295,791,357)
{
PointsArray=#7:350;300|7:420;280|7:450;290|7:480;320|7:370;370|0:|
View=2
FillMode=1
Canvas="myCanvas"
}
Add(GP_Brush,4379932,749,357)
{
Type=1
Color=16777215
Color2=32768
Hatch=38
Canvas="myCanvas"
link(onSet,12965295:doDraw,[])
}
Add(GP_Pen,6016372,707,357)
{
Color=8421504
Size=5
CustomStylePen=[]
Compound=[]
Canvas="myCanvas"
link(onSet,4379932:doSet,[])
}
Add(GP_Canvas,13164349,224,238)
{
Name="myCanvas"
DrawSource=2
link(onSet,11517692:doNext,[])
}
Add(GP_Rectangle,1179926,392,238)
{
X=70
Y=200
Width=200
Hieght=150
View=2
Canvas="myCanvas"
link(onDraw,12816783:doNext,[])
}
Add(GP_Pen,4240771,308,238)
{
Color=255
Alpha=100
Size=12
StylePen=3
CustomStylePen=[]
DashCap=1
Compound=[]
Canvas="myCanvas"
link(onSet,11004791:doData,[])
}
Add(DoData,11004791,350,238)
{
link(onEventData,1179926:doDraw,[])
}
Add(GP_Arc,13787627,728,238)
{
X=500
Y=10
Width=120
Hieght=120
SweepAngle=90
Mode=1
View=2
Canvas="myCanvas"
link(onDraw,6366341:doData,[])
}
Add(GP_Pen,5423501,602,238)
{
Color=32896
Size=7
CustomStylePen=[]
DashCap=1
Compound=[]
Canvas="myCanvas"
link(onSet,13604446:doSet,[])
}
Add(Counter,12265591,686,238)
{
Max=359
Step=5
link(onNext,13787627:doDraw,[])
}
Add(DoData,6366341,770,238)
{
link(onEventData,4302817:doSet,[(815,244)(815,286)(166,286)(166,314)])
}
Add(GP_Curve,10757079,560,238)
{
PointsArray=#7:520;100|7:520;170|7:550;200|7:570;150|7:620;130|0:|
Type=1
Canvas="myCanvas"
link(onDraw,5423501:doSet,[])
}
Add(GP_Pen,11217108,476,238)
{
Color=16711680
Size=3
StylePen=3
CustomStylePen=[]
DashCap=1
Compound=[]
Canvas="myCanvas"
link(onSet,5720461:doData,[])
}
Add(GP_Brush,13604446,644,238)
{
Type=1
Color=8388736
Color2=16777215
Alpha2=0
Hatch=5
Canvas="myCanvas"
link(onSet,12265591:doNext,[])
}
Add(DoData,7913161,581,357)
{
link(onEventData,4069778:doSet,[])
}
Add(Counter,12816783,434,238)
{
Max=9
link(onNext,11217108:doSet,[])
}
Add(DoData,5720461,518,238)
{
link(onEventData,10757079:doDraw,[])
}
Add(Timer,2031693,63,329)
{
Interval=33
link(onTimer,287152:doRedraw,[])
}
Add(WinTools,287152,105,301)
{
Point(doRedraw)
link(Handle,8998479:Handle,[(111,264)(188,264)])
}
Add(Label,3379665,28,28)
{
Left=2
Top=2
Width=56
Align=2
Transparent=0
Caption="Я тут для автоматической двойной буферизации ^_^"
}
END_SDK
------------ Дoбавленo в 13.57:
sla8a, кстати, это моё воображение, или в Вашем примере утекает память