2012-07-13 16 views
6

Win32 C++で透明なチェックボックスを作成しました。 NSISインストーラでこのチェックボックスを使用する必要があります。WinAPI透明ウィンドウをクリアする方法

問題:再ペイントするときに透明な背景を消去する方法がわからないので、「クリアキャンバス」を描画できます。これは、ユーザーがチェックボックス内のテキストを変更し、それを再描画する必要がある場合に重要です。誰もが透明な窓を持っていなければならない問題に遭遇したと思います。

透明ウィンドウをクリアする方法注:私はWinAPIに精通しているので、ウィンドウの上に再塗りつぶすだけで本当にウィンドウAFAIKをクリアすることはできません。

  • うまくいけば、送信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

ウィンドウスタイルを削除するようにしてください。 –

+0

WM_ERASEBKGNDメッセージハンドラでは何をしますか? –

+0

@LarryOstermanうーん、以前はそのメッセージと一緒に働いたことはありませんか?今は何もしないで、私はどうしたらいいですか? –

答えて

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

透明な「色」または標準的なボタンの灰色をペイントしますか?チェックボックスは透明な背景を持ち、その親hwndは標準のグレーの背景を持たないかもしれないことを覚えていて、画像などである可能性があります。 –

+0

@JakeM更新された答えを見てください。私はあなたがチェックボックスの描画部分を処理していると仮定しています。 –

0

あなたは今まであなたはそれを再描画したい場合、それは四角形の無効、別のウィンドウに描画メッセージを送信したくないWS_CLIPCHILDREN一般に

+0

チェックボックスやチェックボックスの親からスタイルを削除することを意味しますか? –

+0

チェックボックスから@JakeM –

関連する問題