2008-11-25 22 views
9

W aplikacji, którą koduję, chciałbym utworzyć komunikat ostrzegawczy, który wyświetli duży półprzezroczysty komunikat ostrzegawczy, nie wpływając na pracę użytkowników. Zasadniczo zniknę w wiadomości, ale nigdy nie ustawię jej przezroczystości na 1 i chcę, aby użytkownik mógł kliknąć "przez" wiadomość tak, jakby jej tam nie było.Przezroczyste okno (lub rysowanie na ekranie) Brak przechwytywania myszy

Zacząłem od używania zawsze w górnym oknie i ustawiania stylu okna na none oraz ustawiania tła i przezroczystości na biały. W tym oknie znajduje się etykieta z dużą czcionką, która zawiera komunikat ostrzegawczy (później prawdopodobnie pomijam zdarzenie paint i maluję komunikat za pomocą GDI). Używam timera, aby zaniknąć w wiadomości, wybierając jego krycie przed ponownym wybraniem numeru. Działa to dobrze, ponieważ fokus nie zostaje skradziony z żadnej aplikacji, ale przezroczysta forma przechwytuje zdarzenia myszy, a nie formularz pod nim (w rzeczywistości większość przezroczystej formy nie przechwytuje zdarzeń myszy, tylko tekst etykiety nie).

Również nie jestem pewien, czy to optymalne podejście, może powinienem jakoś malować prosto na ekranie.

Jak mogę poprawić rzeczy.

Odpowiedz

10

Zastąp właściwość CreateParams w klasie Form i upewnij się, że został ustawiony styl rozszerzony WS_EX_NOACTIVATE. Kopalnia wygląda następująco:

protected override CreateParams CreateParams 
{ 
    get 
    { 
    CreateParams baseParams = base.CreateParams; 

    baseParams.ExStyle |= (int)(
     Win32.ExtendedWindowStyles.WS_EX_LAYERED | 
     Win32.ExtendedWindowStyles.WS_EX_TRANSPARENT | 
     Win32.ExtendedWindowStyles.WS_EX_NOACTIVATE | 
     Win32.ExtendedWindowStyles.WS_EX_TOOLWINDOW); 

    return baseParams; 
    } 
} 

Wartości ExtendedWindowStyles użytych powyżej są:

WS_EX_LAYERED = 0x00080000, 
WS_EX_NOACTIVATE = 0x08000000, 
WS_EX_TOOLWINDOW = 0x00000080, 
WS_EX_TRANSPARENT = 0x00000020, 
+1

Dzięki, szczupły kod. To działa doskonale dla mnie. –

Powiązane problemy