2012-08-05 77 views
1

當我在下面的代碼使用SetBkMode(hdc, TRANSPARENT);,我當我調整主窗口下面的效果(因此當孩子收到WM_PAINT消息):SetBkMode(HDC,透明)不起作用

enter image description here

問題是:當我調整主窗口的大小時,「Find:」的舊區域會被擦除,我猜。但它仍然存在。

如果我不使用SetBkMode(hdc, TRANSPARENT);,我沒有這個問題。它看起來像:

enter image description here

,即它具有白色背景。此外,如果我使用SetBkMode(hdc, TRANSPARENT);,它看起來像上面一樣,然後再調整主窗口的大小。所以我不認爲SetBkMode(hdc, TRANSPARENT);在這裏工作。

hwnd是一個風格爲SS_BITMAP風格的靜態小孩。

你知道爲什麼會出現這個問題嗎?

switch (message) { 
    case WM_PAINT: 
     PAINTSTRUCT ps; 
     HDC hdc = BeginPaint(hwnd, &ps); 

     SelectObject(hdc, gDefaultGuiFont); 
     SetBkMode(hdc, TRANSPARENT); 

     RECT rc; 
     GetClientRect(hwnd, &rc); 
     DrawText(hdc, _TR("Find:"), -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER); 

     EndPaint(hwnd, &ps); 

     return 0; 

    ............. 
} 
+0

問題是什麼?你畫「查找」並得到象形文字? – Maximus 2012-08-05 08:14:18

+0

不,我上傳了一張新圖片,使問題變得清晰。 – user565739 2012-08-05 08:16:27

+0

看起來像這是工具欄部分。以爲,它不需要調整大小? – Maximus 2012-08-05 08:26:10

回答

0

嘗試使用「固定」矩形。例如

RECT rc; 
    GetClientRect(hwnd, &rc); 
    rc.left += ...; rc.top += ...; // shift up-left point 
    DrawText(hdc, _TR("Find:"), -1, &rc, DT_SINGLELINE | DT_LEFT | DT_TOP); 

的想法是你在錯誤的位置(一次),並在合適的位置(兩次)繪製文本而backgound更新一次。不能說部分代碼更多。

0

問題是,Windows並未更新靜態控件背後的控件(時間),因此您現在負責它的內容。所以你想使用父母提供的背景。好只問父畫爲您在子窗口:

RECT rc; 
GetClientRectRelative(m_hWnd, GetParent(m_hWnd), &rc); 
SetWindowOrgEx(m_mdc, rc.left, rc.top, NULL); 
SendMessage(GetParent(m_hWnd), WM_PAINT, (WPARAM)(HDC)m_mdc); 
SetWindowOrgEx(m_mdc, 0, 0, NULL); 

在這

bool GetClientRectRelative(HWND hWnd, HWND hWndRelativeTo, RECT *pRect) 
{ 
    RECT rcWnd, rcRelativeTo; 
    if (!GetClientRect(hWnd, &rcWnd) || 
      !ClientToScreen(hWnd, (POINT*)&rcWnd) || 
      !ClientToScreen(hWnd, (POINT*)&rcWnd + 1) || 
      !GetClientRect(hWndRelativeTo, &rcRelativeTo) || 
      !ClientToScreen(hWndRelativeTo, (POINT*)&rcRelativeTo) || 
      !ClientToScreen(hWndRelativeTo, (POINT*)&rcRelativeTo + 1)) 
     return false; 

    pRect->top = rcWnd.top - rcRelativeTo.top; 
    pRect->left = rcWnd.left - rcRelativeTo.left; 
    pRect->right = rcWnd.right - rcRelativeTo.left; 
    pRect->bottom = rcWnd.bottom - rcRelativeTo.top; 

    return true; 
} 

現在畫你喜歡的東西,我建議你使用TRANSPARENT背景模式。

請創建您的所有子窗口,樣式爲WS_CLIPCHILDRENWS_CLIPSIBLINGS,那麼這些問題將會立即顯現,並且避免閃爍。