2012-07-13 15 views
6

Utworzono przezroczyste pole wyboru w Win32 C++. Zrobiłem to, ponieważ o ile wiem, nie możesz mieć przezroczystego checkboxa w natywnym Win32 i muszę użyć tego pola wyboru w instalatorze NSIS.Jak "wyczyścić" przezroczyste okno WinAPI

Mój problem: Podczas malowania nie wiem, jak usunąć przezroczyste tło, aby móc rysować na "przezroczystym płótnie". Jest to ważne, gdy użytkownik zmienia tekst w polu wyboru i muszę go odświeżyć. Sądzę, że natknąłem się na problem, który wszyscy muszą uzyskać dzięki przezroczystym oknom.

W jaki sposób mogę wyczyścić moje przezroczyste okno? Więc szukam porady na jakie techniki można użyć, aby przerysować okno takie jak:

  • Wyślij wiadomość przemalować do okna nadrzędnego, które, miejmy nadzieję, przemalować rodzica (który jest siedzieć poniżej wyboru) withut wysyłania wiadomość do jej dzieci (tj. pole wyboru). Spróbowałem tego, sprawiło, że pole wyboru ma dużo migotania.
  • Może tam jest przezroczysta funkcja pędzla/farby Nie wiem o tym, że mogę użyć do namalowania całego okna wyboru, które zasadniczo wyczyści okno? Próbowałem to zrobić, że okno wyboru czarne z jakiegoś powodu?

Mój kod:

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

W ogóle nie kiedykolwiek chcesz wysłać wiadomość farby do innego okna, jeśli chcesz to przemalowany, unieważnia to prostokąt. –

+0

Co robisz w module obsługi komunikatu WM_ERASEBKGND? –

+0

@LarryOsterman hmm nigdy wcześniej nie pracowałeś z tą wiadomością? Nic więc teraz, co powinienem zrobić? –

Odpowiedz

0

trzeba obsłużyć komunikat WM_ERASEBBKGND. Powinno zadziałać coś takiego!

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

Czy to pomaluje przezroczysty "kolor" lub standardowy szary kolor przycisku? Pamiętaj, że pole wyboru ma przezroczyste tło, a jego macierzysty hwnd może nie mieć standardowego szarego tła, może to być obraz itp. –

+0

@JakeM Zobacz zaktualizowaną odpowiedź. Zakładam, że obsługujesz część rysunku w polu wyboru. –

0

spróbować usunąć styl okna WS_CLIPCHILDREN

+0

masz na myśli usunąć styl z pola wyboru lub pola wyboru rodziców? –

+0

@JakeM z pola wyboru –