2012-07-13 55 views
6

我在Win32 C++中創建了一個透明覆選框。我已經做到了,因爲據我所知你不能在本機win32中有一個透明的複選框,我需要在NSIS安裝程序中使用這個複選框。如何「清除」WinAPI透明窗口

我的問題:重新粉刷時,我不知道如何抹去透明背景,這樣我就可以畫出一個「清晰的畫布」。當用戶更改複選框內的文本時,這很重要,我需要重新繪製它。我想我已經遇到了每個人都必須用透明窗口得到的問題。

什麼是我可以清除我的透明窗口的方法,注意我熟悉WinAPI,你不能真正清除窗口AFAIK,因爲你只是在窗口上重新繪製。所以,我在找上我可以用什麼方法來重繪窗口,如建議:

  • 發送重繪消息,希望這將重繪父(這是複選框下面的SIT)的父窗口withut發送一條消息傳遞給其子女(即複選框)。我試過這個,它使複選框有很多閃爍。
  • 也許這是一個透明的畫筆/繪畫功能我不知道,我可以使用繪畫在整個複選框窗口,這將基本上清除窗口?我試過這個,它使複選框窗口黑色出於某種原因?

我的代碼:

case WM_SET_TEXT: 
{ 
     // set checkbox text 
     // Technique 1: update parent window to clear this window 
     RECT thisRect = {thisX, thisY, thisW, thisH}; 
     InvalidateRect(parentHwnd, &thisRect, TRUE); 
} 
break; 
case WM_PAINT: 
{ 
    PAINTSTRUCT ps; 
    HDC hdc = BeginPaint(hwnd, &ps); 
    // Technique 2: 
    SetBkMode(hdc, TRANSPARENT); 
    Rectangle(hdc, thisX, thisY, thisW, thisH); // doesn't work just makes the window a big black rectangle? 
    EndPaint(hwnd, &ps); 
} 
break; 
+3

一般來說,你再也不想發送繪製消息到另一個窗口,如果你想重新粉刷,廢止它的矩形。 – 2012-07-13 03:15:35

+0

你在WM_ERASEBKGND消息處理程序中做什麼? – 2012-07-13 03:16:35

+0

@LarryOsterman嗯以前從來沒有與該消息的工作?所以現在沒有,我該怎麼辦? – 2012-07-13 03:28:59

回答

0

您需要處理WM_ERASEBBKGND消息。像下面的東西應該工作!

case WM_ERASEBKGND: 
{ 
    RECT rcWin; 
    RECT rcWnd; 
    HWND parWnd = GetParent(hwnd); // Get the parent window. 
    HDC parDc = GetDC(parWnd); // Get its DC. 

    GetWindowRect(hwnd, &rcWnd); 
    ScreenToClient(parWnd, &rcWnd); // Convert to the parent's co-ordinates 

    GetClipBox(hdc, &rcWin); 
    // Copy from parent DC. 
    BitBlt(hdc, rcWin.left, rcWin.top, rcWin.right - rcWin.left, 
     rcWin.bottom - rcWin.top, parDC, rcWnd.left, rcWnd.top, SRC_COPY); 

    ReleaseDC(parWnd, parDC); 
} 
break; 
+0

這會繪製一個透明的「顏色」或標準按鈕灰色嗎?記住複選框有一個透明背景,其父HWWD可能沒有標準的灰色背景,它可能是一個圖像等。 – 2012-07-13 03:43:04

+0

@JakeM查看更新的答案。我假設你正在處理複選框的繪圖部分。 – 2012-07-13 04:03:46

0

嘗試刪除窗口樣式WS_CLIPCHILDREN

+0

你的意思是從複選框或複選框的父級刪除樣式嗎? – 2012-07-13 03:57:48

+0

@JakeM from複選框 – 2012-07-13 03:59:46