2010-12-13 11 views
5

Pracuję nad aplikacją Win32 GUI, używając prostego interfejsu API Win32 (bez MFC lub .NET). Problem, który mam, sprawia, że ​​kontrole są przejrzyste. Mam wymyślić sposób, który działa dla większości rzeczy, Windows Vista + robię to w WndProc:Sterowniki Win32 przejrzyste we wszystkich wersjach systemu Windows

case WM_CTLCOLORSTATIC: 
{ 
    SetBkMode((HDC)wParam, TRANSPARENT); 
    return (INT_PTR)::GetStockObject(NULL_PEN); 
} 
break; 

W systemie Windows XP, robię to w WndProc:

case WM_CTLCOLORSTATIC: 
{ 
    HBRUSH hbr = (HBRUSH)DefWindowProc(hDlg, message, wParam, lParam); 
    ::DeleteObject(hbr); 
    SetBkMode((HDC)wParam, TRANSPARENT); 
    return (LRESULT)(HBRUSH)(COLOR_WINDOW); 
} 

teraz działa to dla większości kontrolek, jednak otrzymuję przezroczyste tło na etykiecie na górze kontrolki skrzynki grupowej, która rysuje linię pola grupy przez tekst. Zacząłem pracować nad skrzynką na skrzynki grupowe, ale jestem pewien, że jest to problem, który musiał być wcześniej rozwiązany i nie chcę ponownie wymyślać koła.

Czy wypróbowana i sprawdzona metoda sterowania wydaje się być przezroczysta?

Dzięki J

+1

Nie sądzę, że powinieneś usunąć taki pędzel ... – Anders

+0

Czy jesteś pewien, że kanał alfa jest dostępny na wszystkich platformach, które chcesz? A co z osobami, które muszą korzystać z Twojej aplikacji na komputerze z usługami terminalowymi, zdalnym pulpitem lub serwerem Windows?Co masz na myśli przez "Wszystkie wersje systemu Windows"? Windows 98? To także Win32! Może mógłbyś powiedzieć "Wszystkie wersje systemu Windows z Windows XP i nowszych", jeśli o to ci chodzi. –

+0

Prawdopodobnie masz rację, działa, czy usunę szczotki, czy nie. Nie pamiętam, skąd wziąłem ten kod od teraz, ale było wyjaśnienie, dlaczego pędzel został usunięty w ten sposób. – JWood

Odpowiedz

6

Aby osiągnąć przejrzystych kontroli będziesz mieć świadomość, że:

  • Naprawdę nie mogę. Standardowe elementy sterujące Windows po prostu nie obsługują "przezroczystego" malowania.
  • Nawet jeśli zrobisz to dobrze, okno będzie migotać źle, jeśli zmienisz rozmiar.
  • "Hacki" służące do uzyskiwania przezroczystego malowania elementów sterujących mają tendencję do odmienności w przypadku włączania i wyłączania motywów oraz zmiany między wersjami okien.

Zazwyczaj celem sterowania "przezroczystego" jest pokazanie skóry bitmapy pod kontrolą. Sposobem na osiągnięcie tego rodzaju przejrzystości jest stworzenie mapy bitowej dla tła kontroli. Następnie użyj CreatePatternBrush z mapy bitowej.

Ten fragment kodu DialogProc realizuje najprostszy sposób skórowania możliwe, a następnie zająć się malowaniem zarówno tła okna, a większość z tych kontroli, które obsługują tę formę malarstwa:

// _hwnd is the dialogs handle 
    // _hbrSkin is a pattern brush handle 
    HWND hwndCtl; 
    POINT pt; 
    HDC hdc; 
case WM_CTLCOLORDLG: 
    return (INT_PTR)_hbrSkin; 
case WM_CTLCOLORSTATIC: 
case WM_CTLCOLORBTN: 
    hdc = (HDC)wParam; 
    SetBkMode(hdc,TRANSPARENT); // Ensure that "static" text doesn't use a solid fill 
    pt.x = 0; pt.y = 0; 
    MapWindowPoints(hwndCtl,_hwnd,&pt,1); 
    SetBrushOrgEx(hdc,-pt.x,-pt.y,NULL); 
    return (INT_PTR)_hbrSkin; 

kontroli, które nakładanie będzie rysować niepoprawnie, ponieważ jeden będzie malował swoje "przezroczyste" tło nad drugim. Migotanie można zmniejszyć o:

  • Nie można zmienić rozmiaru okna dialogowego.
  • Ustawienie stylu WS_EX_COMPOSITED w oknie dialogowym, ale ponieważ Windows NT 6 DWM go nie obsługuje, jego zasadniczo bezużyteczne z Vista na.
  • Ustawianie stylu WS_CLIPCHILDREN w oknie dialogowym & lub WS_CLIPSIBLINGS - style te uniemożliwiają użycie pól grup i elementów sterujących tabulaturami, ponieważ polegają one na nakładaniu się elementów sterujących.
  • podklasuj wszystkie kontrolki, używając komunikatu WM_PRINTCLIENT, aby pomalować je do bufora wstecznego, a następnie przepłukać przygotowany bufor zwrotny za jednym razem. Ciężka praca i nie wszystkie kontrolki obsługują WM_PRINTCLIENT.
+0

+1, doskonałe podsumowanie i zawiera wywołanie SetBrushOrgEx, które można łatwo przeoczyć, jeśli testujemy z solidnym tłem. –

Powiązane problemy