请教解决画图闪烁的问题(WM_ERASEBKGND, do ubleBuffered都不行)(100分)

  • 主题发起人 devil_li
  • 开始时间
D

devil_li

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个控件,继承自TCustomPanel,现在在上面画上一个矩形框:
procedure TBcDrawPanel.MouseMove(Shift: TShiftState; X, Y: Integer);
....
Canvas.Rectangle(FSrcPt.X, FSrcPt.Y, FDestPt.X, FDestPt.Y); //清除前一个图形
Canvas.Rectangle(FSrcPt.X, FSrcPt.Y, X, Y); //画上现在的图形
....
画图时有闪烁.
1.设置窗体和控件的DoubleBuffered:=True都不行,
因为doubleBuffered处理是在WM_PAINT消息中完成的:
procedure TWinControl.WMPaint(var Message: TWMPaint);
....
if not FDoubleBuffered or (Message.DC <> 0) then
....
2.WM_ERASEBKGND也不行:
procedure TBcCustomDrawPanel.WMEraseBkgnd(var Msg: TWMEraseBkgnd);
begin
Msg.Result := 0;
end;
3.直接画在Canvas.Handle上也不行:
Rectangle(Canvas.Handle, FSrcPt.X, FSrcPt.Y, FDestPt.X, FDestPt.Y); //清除前一个图形
Rectangle(Canvas.Handle, FSrcPt.X, FSrcPt.Y, X, Y); //画上现在的图形
4.控件总体的刷新我用的内存中画图的方法,但是在画矩形时我不希望用内存中画图的方法.

请教各位高招
 
先内存中画好,在copy到前面。我以前用D5这样做的,但到了D6下编译也也会闪烁。搞不懂!·#¥%
 
画的父窗口设置DoubleBuffered
 
仁兄,小弟以前也遇到过这个问题,很棘手,不过你可以看一下,借助于DelphiX控件,
这个控件自己有些Demo。然后可以先内存中画好,在copy到DXDraw.Surface.Canvas上,
也许效果会好些!当然这只是我个人的一点小建议!
 
父窗口的 DoubleBuffered := True;
 
我的父窗口就是主窗体:
...
1.设置窗体和控件的DoubleBuffered:=True都不行,
...
 
MouseMove的时候没有必要重新绘制,
你只要覆盖父类中的Paint方法
并且设置doublebuffer := true
应该可以吧
 
alaclp:WM_PAINT事件是我自己处理的,是在内存中画图,再贴到Canvas上,
不存在覆盖Paint方法的问题.
再就是,MouseMove中画图不需要重绘整个控件,因此,擦掉以前的图形,会引起闪烁.
请教不重绘整个控件,并且不闪烁的方法
 

Similar threads

顶部