怎样使没有OnPaint事件的控件具有OnPaint事件例如Tpanel(50分)

  • 主题发起人 主题发起人 kane
  • 开始时间 开始时间
补充一下,象TImage那种控件在最小化后,再最大化,图象仍然存在,
但是我如果用TCanvas在Panel上画一个图形,经过刷新后,就没有了,
怎么办?我用OnPaint事件来解决,可是鼠标在Panel上不停的闪烁.
好象鼠标的移动就触发了OnPaint事件.
总之就一句话,如何使在Panel上画的图象在被其他窗口挡住或最小
化,最大话后,还存在
 
Hi kane,

在Windows编程中, 被遮挡的窗体当遮挡物移开后或者窗体从最小化到恢复显示的时
候都会收到WM_Paing消息. WM_Paint消息包括被遮挡的窗体以及需要重新绘制的区
域.

TPanel 是不具备Canvas属性的, 故你不可能用Canvas在Panel上画图. Delphi自带
的带有Canvas属性的控件都有OnPaint事件. 鼠标的移动是不应该触发Paint的. 一
定是你所用控件相互有遮挡尔引发了WM_Paint消息.

在TImage上画的东西, 实际上是画到TImage.Picture.Bitmap上, 最小化, 最大化
后自动调用它的Paint或者Repaint方法来刷新.
 
谢谢huizhang,我是用这样的方法的
var
aCanvas:TCanvas;
begin
aCanvas:=TCanvas.Create;
aCanvas.Handle:=GetDC(Panel1.Handle);
aCanvas.Brush.Color:=clBlue;
aCanvas.FillRect(Panel1.ClientRect);
end;
这样,Panel就被我上色了,也可以在上面画图,但是经过遮挡或最小化,
最大化后就没有了,我如何使它再现呢
 
试试把这段代码放在form.onpaint()中.
 
to cane:
要在Panel上画画,可以在它上面放上一个PaintBox控件,

响应PaintBox的OnPaint事件在PaintBox上画....
 
1.Tpanel没有canvas属性,因次无On_Paint事件.
2.但你可以写一个简单的控件,继承自Tpanel,但可以处理WM_Paint消息.
3.添加消息处理函数有两种方法,详见Delphi帮助.(写的很清楚的说).
 
to:jghuang
效果不错,但是当有别的窗口挡住时,直接点击本窗口,不会
触发Form的OnPaint事件,而且我要动态创建N个Panel放在ScrollBox
里,我希望当Panel出现在ScrollBox的可视范围内时,自己把自己画
一遍,就好象ACDSee.
to:VC
因为我要创建多个,所以想尽量少用内存,不用其他控件,直接向
Panel上画。
我就想达到象ACDSee的那种效果就可以了:)
谢谢大家!!
 
to 宋非:
我用到了WM_Paint事件,可是因为我在过程中用到了
Paint,所以它会不停的收到WM_Paint,我又不停的画,产
生了循环,导致画面闪烁,很是难办。
 
用一个TImage,在TImage的不同区域绘画来模拟多个控件.这种方法
最省资源,而且比较简单,连OnPaint都不用响应.
 
你是否可以在你用Paint过程中把你发的WM_PAINT消息的wparam记下来,
然后在自己定义的事件函数中鉴别一下再处理,这样就不循环了?
 
你是否可以在你用Paint过程中把你发的WM_PAINT消息的wparam记下来,
然后在自己定义的事件函数中鉴别一下再处理,这样就不循环了?
 
to 宋非:
我的Paint就是Canvas的FillRect啊,这个好象不好办
 
多人接受答案了。
 
后退
顶部