用WM_NCPAINT怎么不行?!

解决方案 »

  1.   

    必须声明无效区域!在下面函数中指定合适的flags,BOOL RedrawWindow(
       LPCRECT lpRectUpdate = NULL,
       CRgn* prgnUpdate = NULL,
       UINT flags = RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE 
    ); 
    flags 
    The following flags are used to invalidate the window: 
    RDW_ERASE   Causes the window to receive a WM_ERASEBKGND message when the window is repainted. The RDW_INVALIDATE flag must also be specified; otherwise RDW_ERASE has no effect. 
    RDW_FRAME   Causes any part of the nonclient area of the window that intersects the update region to receive a WM_NCPAINT message. The RDW_INVALIDATE flag must also be specified; otherwise RDW_FRAME has no effect. 
      

  2.   

    由于标题栏和控制按钮都属于非客户区,所以关键是获得非客户区的CDC,可以通过GetWindowDC()来获得。GetWindowDC()可以获得整个窗口的CDC,当然也包括非客户区的CDC,得到此CDC后,确定标题条的确切位置,就可以在标题栏上为所欲为了。虽然准备好了窗口的标题栏和按钮,但还没有机会显示。要在窗口的客户区上画东东,只需响应Windows的客户区重画消息,在此消息处理函数中实现具体的操作。同理,要在非客户区上画东东,也只需响应Windows的非客户区重画消息,在消息处理函数中完成标题栏和按钮的绘制。 
      

  3.   

    好象在PreCreateWindow里修改风格可以解决
    比如防止MFC在窗口标题栏上把文档名预置成应用程序名cs.style &= ~FWS_PREFIXTITLE;