是的,WM_NCPAINT消息中不会给你REGION。 你必须取得整个窗口的HDC并且自己保证全画在非用户区。画非用户区是很麻烦的, 基本上只能在WM_NCCALCSIZE和WM_NCPAINT中作文章。很多人都认为微软故意把它搞得这么麻烦。

解决方案 »

  1.   

    如果获取的WM_NCPAINT消息的wParam不是1的话,是可以获得REGION的,可是大多数都是1.
    用无标题栏的窗口,那些个边框也都没有了,也不会响应改变大小的事件,这些也都要处理。
      

  2.   

    哪位帮看一下,为什么画不出标题栏? (PanitNonClientArea(Graphics, RectangleF)是没问题的,可以正常画到Bitmap、Panel上。)protected override void WndProc(ref Message m)
    {
    Graphics g;
    RectangleF rectf; Point pt; switch (m.Msg)
    {
    case WMConsts.WM_NCPAINT :
    IntPtr hrgn = m.WParam;
    if ( hrgn != (IntPtr)1 )
    {
    Region rgn = Region.FromHrgn(hrgn);
    g = CreateGraphics();
    rectf = rgn.GetBounds(g);
    PaintNonClientArea(g, rectf);
    }
    else
    {
    g = CreateGraphics();
    rectf = new RectangleF(0,-23, Width, 23);
    PaintNonClientArea(g, rectf);
    g.Dispose();
    }

    //base.WndProc(ref m);
    break; default :
    base.WndProc (ref m);
    break;
    }
    }
      

  3.   

    CreateGraphics返回的hDC是窗口用户区的。你必须用GetWindowDC:[DllImport("User32.dll", CharSet=CharSet.Auto)]
    public static extern IntPtr GetWindowDC(IntPtr hWnd);
    ...
    IntPtr hDC = GetWindowDC(m.HWnd);
    Graphics g = Graphics.FromHdc(hDC);
      

  4.   

    http://www.chinadeer.com/multicolor_title_bar.aspx
      

  5.   

    请问weifenluo(weifenluo), 为什么    Graphics g = Graphics.FromHWnd(m.HWnd)获得的Graphics 与    IntPtr hDC = GetWindowDC(m.HWnd);
        Graphics g = Graphics.FromHdc(hDC);获得的会不同呢?
      

  6.   

    liduke(天下有雪): 
     
      为什么不用c#中自带的画标题的方法来画呢没看到过有呵,C#中自带的画标题的方法是什么?
      
     
      

  7.   

    画标题栏时,除了要处理WM_NCPAINT消息以外,还需要处理哪些消息?
    我发现一按最小化最大化关闭按钮,它们默认的样子就又出来了。