请教:windows的画图板程序是怎么实现不对wm_paint消息起反应的? (100分)

  • 主题发起人 主题发起人 一少
  • 开始时间 开始时间

一少

Unregistered / Unconfirmed
GUEST, unregistred user!
如: 在自己的程序上写上几个字 TextOut(getDC(handle),10,10,'aaa',3)
当窗口被覆盖后或最大化最小化...后,系统会对窗口重画,写上去的字就没了,
而windows自带的画图程序不会这样,
如何让写上去的字始终在上面?
用validateRect可不可以做到?
 
如果你是在你的程序的Form上写上几个字的话,将写上几个字的语句放在Form的OnPaint事件中即可。
 
onPaint中处理不是我想要的,画图板程序不可能写在onPaint中吧???
 
--------------------
why not?
 
你想:如果这个程序是用mouse在窗口上画线,点一下就画一根线,我在上面拖了若干根线,现在不希望窗口最大化后刚才画的线就消失,这样的程序能用OnPaint来处理吗?
 
建立线(等形状)的对象列表吧,在重绘是绘对象
 
很遗憾,windows就是这么处理的,在OnPaint中处理所有的绘图工作.即使只是窗口被
遮住了,重现的时候也一样要在OnPaint中整个重画一遍的.
设计Windows的时候,也考虑过这个问题,有一种解决方案是每个窗口分配一块缓冲区,
保存图像一遍快速重现,考虑到内存的庞大开销这种方案被放弃了.
 
那windows画图程序是怎么实现的?肯定有办法

有这方面的高手吗
 
这个问题不需要很高的手就能回答.
很简单,画图程序将你所画的每一个笔画都记录下来,形成一个列表,在OnPaint的时候
把他们全部重画.不可思议吧,用这么笨的办法.windows只会这么做,没别的办法.
当然,实际上windows也有提高效率的法子,画面上不需要重画的部分是不必重画的,这样就
能提高效率了.
 
agree bluebridge.
 
谢谢bluebridge!
再次请教,我用validateRect指定有效区域后,此区域依然重画,不知是为何?
怎么样指定才能让这个区域不再重画?
 
其实mspaint也不是记下每一笔,而是首先画到自己内存的bitmap对象
响应WM_PAINT事件的时候把内存中的bitmap画上去
你的程序,如果需要让某一块不再画,那你首先需要在内存中保存的bitmap中清除那一块
 
我发现onpaint事件在处理过程中就是对重画区域进行重画,不须重画的区域不重画,并不是全部窗口全部重画,即使你在onpaint中写了重画的语句。没必要忌讳onpaint事件,虽然复杂点,但效果相当不错。
 
procedure TForm1.Button1Click(Sender: TObject);
var
dc:Hdc;
begin
dc:=getdc(Handle);
Canvas.Textout(100, 100, '我爱你');
DeleteDC(dc);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
Button1Click(self);
end;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
588
import
I
后退
顶部