郁闷死了,三态我已实现,只剩2个问题了。
1.在窗体被激活或非激活的状态改变的时候,标题栏仍然重新绘制了。我自己绘制的再覆盖上去
。我用WINSNIGTH看了下
激活与非激活间的消息 ACTIVATEAPP ACTIVE FORM
DEACTIVE FORM
WM_USER +0xAC00
+0xAC01
但就这些消息却引起了标题栏重新绘制,连我在
procedure wmncpaint(var msg:TWMNCPAint);message WM_NCPaint
procedure wmpaint(var msg:TWMPAint);message WM_Paint
procedure wmerasebkgnd(var msg:TWMEraseBkgnd);message WM_EraeBkgnd;procedure tform1.wmncpaint(var msg:TWMNCPAint);
begin
if msg.msg=WM_NCPaint then exit;
...
end;procedure tform1.wmpaint(var msg:TWMPAint);
begin
if (msg.msg=WM_NCPaint) And (msg.msg=WM_Paint) then exit;
..
end;procedure tform1.wmerasebkgnd(var msg:TWMEraseBkgnd);
begin
inherited;
msg.resule:=1;
end;
都无法阻止这两种状态切换之下引发的标题栏重绘。虽然只是一闪而过,很快被我的绘制覆盖,但我真的
不想让它出现。应该如何做,才能截获这些引发重绘的消息。2.如何将标题栏由24改为31。因为,我的MENUBAR被图片盖住了7个象素。呵呵
1.在窗体被激活或非激活的状态改变的时候,标题栏仍然重新绘制了。我自己绘制的再覆盖上去
。我用WINSNIGTH看了下
激活与非激活间的消息 ACTIVATEAPP ACTIVE FORM
DEACTIVE FORM
WM_USER +0xAC00
+0xAC01
但就这些消息却引起了标题栏重新绘制,连我在
procedure wmncpaint(var msg:TWMNCPAint);message WM_NCPaint
procedure wmpaint(var msg:TWMPAint);message WM_Paint
procedure wmerasebkgnd(var msg:TWMEraseBkgnd);message WM_EraeBkgnd;procedure tform1.wmncpaint(var msg:TWMNCPAint);
begin
if msg.msg=WM_NCPaint then exit;
...
end;procedure tform1.wmpaint(var msg:TWMPAint);
begin
if (msg.msg=WM_NCPaint) And (msg.msg=WM_Paint) then exit;
..
end;procedure tform1.wmerasebkgnd(var msg:TWMEraseBkgnd);
begin
inherited;
msg.resule:=1;
end;
都无法阻止这两种状态切换之下引发的标题栏重绘。虽然只是一闪而过,很快被我的绘制覆盖,但我真的
不想让它出现。应该如何做,才能截获这些引发重绘的消息。2.如何将标题栏由24改为31。因为,我的MENUBAR被图片盖住了7个象素。呵呵
恐怕是思路本来就是错误的
喜欢钻牛角尖是好的,但得看看是否可行呀
Windows机制是这样的都没什么奇怪的http://lysoft.7u7.net
在TWinControl.DefaultHandler中的
Result := CallWindowProc(FDefWndProc, FHandle, Msg, WParam, LParam);
就是调用原始的窗口回调函数
你如果想阻止这些消息传给默认的窗口回调函数,程序就会出错,所以只能绘制两次。
有另一种方法就是使用OwnerDraw,就只需绘制一次了
DrawCaptionBar; //重绘标题栏