2013-04-17 138 views
0

圖紙問題與啓動,這是我想要實現但與白色區域的圓角,而不是在這樣 desired look but with rounded corner of white region子窗口在Win32

爲了實現這一目標完全成功所需的外觀,我已經確定要被製成白色矩形的屏幕座標和創建的靜態文本窗口和使用該設定圓形區域:

case WM_CREATE: 
    SetRect(&Rect,...); 
       hSubWnd = CreateWindow("STATIC",NULL,SS_LEFT|WS_CHILD|WS_VISIBLE,Rect.left,Rect.top,(Rect.right-Rect.left),(Rect.bottom-Rect.top),hFrame,(HMENU)NULL,NULL,NULL); 


       hrgn = CreateRoundRectRgn(Rect.left, Rect.top, Rect.right, Rect.bottom,15,15); 
       SetWindowRgn(hSubWnd,hrgn,TRUE); 

然後到着色區域SETT上述我使用了以下內容:

case WM_CTLCOLORSTATIC: 
      //SetBkColor((HDC)wParam, RGB(0,0,0)); 
      if((HWND)lParam == hSubWnd) 
      { 
       SetBkMode((HDC)wParam,TRANSPARENT); 

       return (INT_PTR)CreateSolidBrush(RGB(255,255,255)); 
      } 
      break; 

這使得該區域變成白色,但白色區域未按我的預期舍入。 這裏是我的問題:

1-如何使SetWindowRgn()工作的子控件?我的方法是否正確或我需要採取其他方式來實現我的目標(四捨五入小孩的角落)?

2-父窗口啓用了WS_CLIPCHILDREN樣式,這意味着無論我在主窗口的WM_PAINT中做什麼都不會繪製子窗口區域。我還需要將一些文本放入子窗口的白色區域。我在哪裏做? TextOut()在WM_CTLCOLORSTATIC處理程序中似乎不起作用。

我應該將孩子的窗口類從「STATIC」更改爲一些自定義類,併爲孩子編寫WindowProc(),其中我處理WM_PAINT以在其上繪製文本?

請提供您的建議。

+0

是變量'hrgn'全球?對'SetWindowRgn()'的調用返回一個非零值嗎? –

回答

2

既然你說你正在爲你的主窗口處理WM_PAINT來繪製文本,我建議完全跳過子控件和區域的複雜性。

我的意思是,所有你想要的是窗口背景上的白色圓角矩形?所以你自己畫吧。這通過使用RoundRect函數簡單地完成。

如果您需要使用靜態控制來確定RoundRect的座標(這可以使處理更容易,例如,處理不同的DPI設置),您可以將其保留但不可見。

示例代碼:

void OnPaint(HWND hWnd) 
{ 
    PAINTSTRUCT ps; 
    BeginPaint(hWnd, &ps); 

    // Create and select a white brush. 
    HBRUSH hbrWhite = CreateSolidBrush(RGB(255, 255, 255)); 
    HBRUSH hbrOrig = SelectObject(ps.hdc, hbrWhite); 

    // Create and select a white pen (or a null pen). 
    HPEN hpenWhite = CreatePen(PS_SOLID, 1, RGB(255, 255, 255)); 
    HPEN hpenOrig = SelectObject(ps.hdc, hpenWhite); 

    // Optionally, determine the coordinates of the invisible static control 
    // relative to its parent (this window) so we know where to draw. 
    // This is accomplished by calling GetClientRect to retrieve the coordinates 
    // and then using MapWindowPoints to transform those coordinates. 

    // Draw the RoundRect. 
    RoundRect(ps.hdc, Rect.left, Rect.top, Rect.right, Rect.bottom, 15, 15); 

    // If you want to draw some text on the RoundRect, this is where you do it. 
    SetBkMode(ps.hdc, TRANSPARENT); 
    SetTextColor(ps.hdc, RGB(255, 0, 0)); // red text 
    DrawText(ps.hdc, TEXT("Sample Text"), -1, &Rect, DT_CENTER); 

    // Clean up after ourselves. 
    SelectObject(ps.hdc, hbrOrig); 
    SelectObject(ps.hdc, hpenOrig); 
    DeleteObject(hbrWhite); 
    DeleteObject(hpenWhite); 
    EndPaint(hWnd, &ps); 
} 
+0

這聽起來不錯。非常感謝,會嘗試一下,讓你知道。:)有一個API的海洋知道..lol ...:P – user1624807

+0

尚未運行此代碼,但只是試圖瞭解。你製作了一支白色筆和一支白色筆,然後用它來繪製RoundRect()。這是如何設置圓角矩形的背景? api是否負責照顧?正如你在圖像中看到的,我想要一個在藍色窗口背景上有白色圓角矩形的背景。 – user1624807

+0

好的,我通過RoundRect()的文檔並得到了答案。 – user1624807