█TSpeedButton 不见了? 原因是我在窗体的WM_PAINT消息中调用了begin Paint函数! ( 积分: 100 )

  • 主题发起人 主题发起人 LoveKilly
  • 开始时间 开始时间
L

LoveKilly

Unregistered / Unconfirmed
GUEST, unregistred user!
窗体上放一个SpeedButton,重载窗体的WM_PAINT消息,输入代码如下:
procedure TForm1.WMPaint(var Message: TWMPaint);
var
ps: TPaintStruct;
begin
BeginPaint(Handle, ps);
// do something
EndPaint(Handle, ps);
inherited;
end;
这时SpeedButton不见了,不加BeginPaint就不会出现这种情况了。
 
窗体上放一个SpeedButton,重载窗体的WM_PAINT消息,输入代码如下:
procedure TForm1.WMPaint(var Message: TWMPaint);
var
ps: TPaintStruct;
begin
BeginPaint(Handle, ps);
// do something
EndPaint(Handle, ps);
inherited;
end;
这时SpeedButton不见了,不加BeginPaint就不会出现这种情况了。
 
为什么加上 BeginPaint 和 EndPaint 函数调用,子控件(从TGraphControl继承下来的)无法自行绘制?
 
inherited;
BeginPaint(Handle, ps);
// do something
EndPaint(Handle, ps);
 
var
PS: TPaintStruct;
begin
if not IsIconic(Handle) then
begin
ControlState := ControlState + [csCustomPaint];
inherited;
ControlState := ControlState - [csCustomPaint];
end
else
[blue] begin
BeginPaint(Handle, PS);
// do Something
EndPaint(Handle, PS);
end;[/blue]
end;
就可以了,但是蓝色的部分根本就没有画,说明是inherited的位置问题,后来调整了就好了

procedure TForm1.WMPaint(var Message: TWMPaint);
var
PS: TPaintStruct;
begin
inherited;
{if not IsIconic(Handle) then
begin
ControlState := ControlState + [csCustomPaint];
inherited;
ControlState := ControlState - [csCustomPaint];
end
else
begin }
BeginPaint(Handle, PS);
// do Something
EndPaint(Handle, PS);
//end;
end;
 
chenybin:
多谢,可是。。。不行啊,你试试在//do some thing处输入代码:
procedure TForm1.WMPaint(var Message: TWMPaint);
var
PS: TPaintStruct;
begin
...
BeginPaint(Handle, PS);
// do some thing
MoveToEx(ps.hdc, 10, 10, nil); // 画一条直线
LineTo(ps.hdc, 100, 100);
EndPaint(Handle, PS);
..
end;
end;

直线没有被显示出来耶,[:(]
 
procedure TForm1.WMPaint(var Message: TWMPaint);
var
PS: TPaintStruct;
DC: HDC;
begin
Inherited;

DC := BeginPaint(Handle, PS);
// do some thing
Canvas.MoveTo(10, 10); // 画一条直线,没有具体处理,想来应该是DC和PS的问题,你是要画图吗?在这里重新好像比较低效率吧,每次都画一下,一般都是贴图
Canvas.LineTo(100, 100);
EndPaint(Handle, PS);
end;

另外,TWMPaint = packed record
Msg: Cardinal;
DC: HDC;
Unused: Longint;
Result: Longint;
end;
这个结构对你是不是有帮助
 
to chenybin兄:
  大概在窗体坐标为(8,8)的位置上放一个SpeedButton,你看一下,那条直线会画到控件上了。
 
你是不是想做控件间连线的东西

是不是考虑另外弄个线控件
 
我最近在做窗体设计器,先要在窗体上画一些网点,昨天我发现从TGraphControl继承下来的控件都无法显示。
 
明白你的意思了

第一、建议去找论坛里面的TLine等线控件
第二、http://www.delphibbs.com/delphibbs/dispq.asp?LID=103448

http://www.delphibbs.com/delphibbs/dispq.asp?LID=098481,这方面的帖子还有很多

另外我昨天回了一个帖子,可能对你有帮助,http://www.2ccc.com 里面有个关于RTTI的东西,是关于属性编辑的

上面的问题我是这样解决的
procedure TForm1.WMPaint(var Message: TWMPaint);
begin
Canvas.MoveTo(10, 10);
Canvas.LineTo(100, 100);
// 现在在当前Form上画你要处理的内容,然后在调用父类的方法,画控件
Inherited;
end;
 
to chenybin兄:
我采用了你提的解决方法,在窗体在放多个SpeedButton,随便单击几下,直线又画到控件上了,:(,帮我再看一下啊。
 
用了偏门的办法解决问题了,界面上先放一个Image1,设置这个Image1在最后面,然后设置form的双缓冲,如果要效果好看,就给Image1放一个图片,颜色和btnFace一样就可以了

procedure TForm1.WMPaint(var Message: TWMPaint);
begin
Image1.Canvas.MoveTo(10, 10);
Image1.Canvas.LineTo(100, 100);
// 现在在当前Form上画你要处理的内容,然后在调用父类的方法,画控件
Inherited;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
form1.doublebuffered:=true;
Image1. SendToBack;
end;
 
to chenybin:
多谢chenybin兄,问题解决,散分喽。
 
接受答案了.
 

Similar threads

后退
顶部