2014-02-28 72 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