处理WM_NCPAINT消息

来源:互联网 发布:做条形码的软件 编辑:程序博客网 时间:2024/04/30 20:08

处理WM_NCPAINT消息可以实现自绘窗口边框和标题栏。     

    手头有个窗口需要自绘边框,于是处理了WM_NCPAINT消息,结果程序初运行时可以正常绘制,一旦最小化或者调整窗口位置后就看不到自绘的边框了。找了半天发现犯了个愚蠢的错误。在获取窗口矩形后未做处理便开始了绘图操作,现在加上平移操作,使要绘制的矩形左上角坐标归零后一切正常。     

    窗口包含WS_BORDER和WS_THICKFRAME风格,边框大小一般为4。     

    代码如下:

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. if( uMsg == WM_NCPAINT )  
  2.   
  3. {  
  4.   
  5.     HDC hdc;  
  6.   
  7.     hdc = GetWindowDC(hWnd);  
  8.   
  9.     // Paint into this DC  
  10.   
  11.     RECT rcWin;  
  12.   
  13.     GetWindowRect(hWnd, &rcWin);  
  14.   
  15.     OffsetRect( &rcWin, -rcWin.left, -rcWin.top );  
  16.   
  17.     for(int i=0; i<4; i++)  
  18.   
  19.     {  
  20.   
  21.         FrameRect(hdc, &rcWin, m_hbr[i]);  
  22.   
  23.         InflateRect(&rcWin, -1, -1);          
  24.   
  25.     }  
  26.   
  27.   
  28.   
  29.     ReleaseDC(hWnd, hdc);  
  30.   
  31.     return 0;  
  32.   
  33. }  
    其中m_hbr是HBRUSH类型的数组,含4个元素,用CreateSolidBrush函数做了初始化。处理完WM_NCPAINT消息后返回0,阻止系统调用DefWindowProc继续处理。
0 0
原创粉丝点击