如何实现重画图形时不会闪烁???(50分)

  • 主题发起人 主题发起人 snappy
  • 开始时间 开始时间
S

snappy

Unregistered / Unconfirmed
GUEST, unregistred user!
我设计了一个图形控件,用Canvas重画图形时老是出现闪烁现象,请问如何消除??
 
你是从什么inherited,如果从图形比较好
 
分析一下你的代码,不要连续两次调用重画.
 
14.1 当构件重绘时如何防止闪动的情况?
如果构件的 ComponentStyle 属性没有包含 csOpaque 旗帜的话,调用 Invalidate方法时
会导致构件的背景先被擦掉再重绘。如果你在 Paint 方法中绘制背景,那你应该在构件的建构函式中加上:
ComponentStyle := ComponentStyle + [csOpaque];
Max Nilson的回答:
引起闪动另一个原因可能是 WM_ERASEBKGND 讯息的处理。当 VCL 控制项收到一个 WM_ERASEBKGND
讯息时,它会将构件的背景擦掉然後配置成预设的颜色。如果你的元件衍生自
TWinControl,而且构件的颜色与背景颜色不同(例如图形),每次重画以前都会将构件先清成背景颜色再重绘,这就是造成闪动的原因了!
解决的方法不难,你必须告诉 Windows 你要自行解决『所有的』绘图动作。不过有一个前提是,你一定要确定你的 Paint
方法将整个构件都画过,如果你漏了什麽地方忘了画,那个节的数据会由乱数组成,你能想见这情况吗?使用这个方法可以加速你的构件绘制动作(稍微快一点点),因为少了一个填满背景颜色的动作。
type
TMyComponent = class (TWinControl)
...
protected
procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message
WM_ERASEBKGND;
...
end;
procedure TBMyComponent.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
// 不要重绘背景,这会造成构件闪动
Message.Result := 0
end;
(转贴的送给你了)
 
这个问题很正常,解决此问题最简单的方法是在后台画好图,直接拷贝到前台,绝对不会有闪烁
 
就是双缓冲的意思。
 
用消息WM_SETREDRAW来处理
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
777
DelphiTeacher的专栏
D
D
回复
0
查看
633
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部