2014-02-28 39 views
0

如何绘制自定义边框,其实我试图绘制1像素边框但失败了,我们如何实现这一点? 我曾尝试this.but失败。我试过这样,它工作正常,当窗口没有子窗口..在我的情况下我的窗口上有3个子窗口在这种情况下,我正在闪烁。如何在win32中绘制自定义边框?

  case WM_NCACTIVATE : 
      { 
       if(TRUE == wParam) 
      { 
     stateofWindow = true; 
     InvalidateRect(hwnd,NULL,true); 
      } 
     else if(FALSE == wParam) 
     { 
     stateofWindow = false; 
     InvalidateRect(hwnd,NULL,true); 
     } 
    } 
break; 

case WM_NCCALCSIZE : 
    { 
     if (true == wParam) 
     {  
      return 0; 
     } 
    } 
    break; 
case WM_PAINT: 
    { 
     HDC hcd = NULL; 
     PAINTSTRUCT ps; 
     hcd = BeginPaint(hwnd,&ps); 

     HPEN hPen = CreatePen(PS_SOLID, 1, RGB(165,165,165));; 

     SelectObject(hcd, hPen); 

     RECT rcClientRect = {0}; 

     GetClientRect(hwnd,&rcClientRect); 
     //GetWindowRect(hwnd,&rcClientRect); 

     if(FALSE == stateofWindow) 
     { 
      MoveToEx(hcd,rcClientRect.left,rcClientRect.top,NULL); 

      LineTo(hcd,rcClientRect.right-1,rcClientRect.top); 

      LineTo(hcd,rcClientRect.right-1,rcClientRect.bottom-1); 

      LineTo(hcd,rcClientRect.left,rcClientRect.bottom-1); 

      LineTo(hcd,rcClientRect.left,rcClientRect.top); 
     } 
     else 
     { 
      HPEN hPen1 = CreatePen(PS_SOLID, 1, RGB(255,0,0));; 

      SelectObject(hcd, hPen1); 

      MoveToEx(hcd,rcClientRect.left,rcClientRect.top,NULL); 

      LineTo(hcd,rcClientRect.right-1,rcClientRect.top); 

      LineTo(hcd,rcClientRect.right-1,rcClientRect.bottom-1); 

      LineTo(hcd,rcClientRect.left,rcClientRect.bottom-1); 

      LineTo(hcd,rcClientRect.left,rcClientRect.top); 
     } 
     EndPaint(hwnd,&ps); 
    } 
      break; 
+0

一般来说,做自己的非客户绘画是一个坏主意。 (仅仅因为你*可以*做某事并不意味着你*应该*)。 –

+0

谢谢你的回答。我曾尝试过,但没有工作。 – sindhu

回答

2

这有点复杂。它至少需要正确处理WM_NCCALCSIZE,WM_NCPAINTWM_NCHITTEST

另外请注意,自从Aero过来以后,我还没有试过,我知道Aero改变了很多东西:在Aero下,而不是调整实际的边界,而是使用无边框窗口,然后调用Dwm*函数添加类似边框的外观和行为(在MSDN上有关于此的an article)。

+0

谢谢,你能提供一些想法来处理这个问题。我试过但没有得到确切的结果。 – sindhu

+0

IIRC,WM_NCCALCSIZE有一些问题,我从第一次尝试就无法正确使用它。不幸的是我没有这个细节。对于第一次测试,也许你可以忽略WM_NCPAINT,如果你只是在WM_PAINT中填充一个矩形,目标只是为了确保客户区域始终具有合适的大小。 – Medinoc