郁闷死了,三态我已实现,只剩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.   

    没有完全看明白楼主的意思,楼主是要自己重画标题兰吧。这样的话,不如将BorderStyle设为bsNone,然后自己在客户区腾出一块,用来自画标题栏与边框,这样还比较简单,而且比较彻底。
      

  2.   

    又是这个问题
    恐怕是思路本来就是错误的
    喜欢钻牛角尖是好的,但得看看是否可行呀
    Windows机制是这样的都没什么奇怪的http://lysoft.7u7.net
      

  3.   

    因为这些wm_ncpaint、WM_Paint、wm_earsebkgnd消息VCL都会传给了窗口的默认的回调函数,你Exit没用,所以总会有一个原始的绘制过程。
    在TWinControl.DefaultHandler中的
    Result := CallWindowProc(FDefWndProc, FHandle, Msg, WParam, LParam);
    就是调用原始的窗口回调函数
    你如果想阻止这些消息传给默认的窗口回调函数,程序就会出错,所以只能绘制两次。
    有另一种方法就是使用OwnerDraw,就只需绘制一次了
      

  4.   

    WM_NCPAINT,WM_NCACTIVATE,WM_SETEXT中写上如下代码inherited;
    DrawCaptionBar; //重绘标题栏
      

  5.   

    同志们,这个问题已经改决鸟,并写了心得体会,哈哈哈哈,爽啊,另外写了个BuTFORM,不过只能COPY的,你要改也可以,不过看你会不会改了,还做了1套VCLSKIN用的SKN,恩,还不错。谁要啊