Вверх ↑
Ответов: 3889
Рейтинг: 362
#1: 2012-06-02 13:57:59 ЛС | профиль | цитата
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

Попробуйте с Label и без него.
------------ Дoбавленo в 13.57:
sla8a, кстати, это моё воображение, или в Вашем примере утекает память
карма: 1

0