G Great Unregistered / Unconfirmed GUEST, unregistred user! 1999-12-01 #1 我写了一个构件继承自TGraphicControl,但发现在刷新时闪烁很明显,请提示一下如何解决? 不是ControlStyle + [csOpaque]的问题。
I Iknow Unregistered / Unconfirmed GUEST, unregistred user! 1999-12-02 #2 如果有visable属性的话, 先设成false. 或者先在内存中组织好, 然后用canvas画上去, 应该会好些的.
H Hexi Unregistered / Unconfirmed GUEST, unregistred user! 1999-12-02 #3 你在你的控件中添加一个TBitMap, 每次画东西的时候画在TBitMap中, 在Paint中将TBitMap的内容直接复制到控件的Canvas中。
A Another_eYes Unregistered / Unconfirmed GUEST, unregistred user! 1999-12-02 #4 1. controlstyle := controlstyle + [csOpaque]; 2. procedure WMEraseBkgnd(var Message: TMessage); WM_ERASEBKGND; begin message.result := 1; end;
1. controlstyle := controlstyle + [csOpaque]; 2. procedure WMEraseBkgnd(var Message: TMessage); WM_ERASEBKGND; begin message.result := 1; end;
A Aloney Unregistered / Unconfirmed GUEST, unregistred user! 1999-12-02 #5 每次更改图象时调用Invalidate;方法!或者在重画之前Canvas.Lock,画完之后Canvas.UnLock;我也写过一个类似的控件没问题的。
W www Unregistered / Unconfirmed GUEST, unregistred user! 1999-12-02 #6 如果构件的 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;
如果构件的 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;
S spear Unregistered / Unconfirmed GUEST, unregistred user! 1999-12-03 #7 delphi help中有以上说明,似乎wmerasebkgnd中写的是: Amessage.result:=LRESULT(FALSE);