消除“无意义”的闪烁(100分)

  • 主题发起人 主题发起人 Tomas.Samuel
  • 开始时间 开始时间
T

Tomas.Samuel

Unregistered / Unconfirmed
GUEST, unregistred user!
各位Delphi高手:
我在显示图形时,用的是TImage控件,好用倒好用,但有一个严重的缺陷:在改变显

示区大小时,闪烁十分厉害,(即使是在关闭了Strech和Autosize后,且变大区域完全不

需刷新TImage范围时,TImage仍被刷新闪烁)。我希望作到想Win95中,既在改变大小的

拖动过程中,只画虚框,且完全阻止TImage刷新,在完成拖动,释放鼠标后,重新计算修

改TImage,然后刷新。但鉴于本人对Delphi的整个Window的消息机制并未完全掌握,在实

现的过程中有如下问题:
1。要想画虚框,必要捕获相应的消息,(即WM_SIZE)在Delphi中有OnResize与

OnCanResize两个可选,但都不知道鼠标的拖动何时结束,对于调整大小的鼠标拖动的的

结束,Delphi有现成的事件吗?如没有是否要捕获WM_SIZE, 还是别的消息(windows有上

千个消息呀)?如果是要捕获WM_SIZE,如何使之不与OnResize冲突?
2。我认为TImage之所以做许多“无意义”的闪烁,是由于Delphi总是调用父对象的

OnPaint(WM_PAINT)后,“毫无选择”的调用子对象的OnPaint。(如果TImage的位置大

小完全无改变,刷新岂不毫无意义),我想加入我自己的选择,但不知加在哪儿?TImage

好象没有OnPaint事件。:-(
3。有时听说有双缓冲的说法,是否对本问题有益?
望各位指点迷津,小生在此谢谢先!:-)

Tomas
 
image.visible:=false;
then to do you code...
image.visible:=true;
 
你需要处理Windows消息,来消除闪烁 :
在声明部分加入 :
procedure WMEraseBkgnd(var m:TWMEraseBkgnd); message WM_ERASEBKGND;
实现部分 :
procedure TForm1.WMEraseBkgnd(var m:TWMERASEBKGND);
begin
m.Result := LRESULT(False);
end;
其实,无论你做什么操作,都应该先在事先创建好的位图上进行,
然后将位图拷到Image.Picture.Bitmap上.
 
接受答案了.
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部