2008-11-25 15 views
9

In einer App, die ich codiere, möchte ich eine Warnmeldung anzeigen, die eine große halbtransparente Warnmeldung anzeigt, ohne die Arbeit der Benutzer zu beeinträchtigen. Grundsätzlich werde ich die Nachricht einblenden, aber die Opazität niemals auf 1 setzen und ich möchte, dass der Benutzer die Nachricht "durch" klicken kann, als wäre sie nicht da.Transparentes Fenster (oder Zeichnen auf Bildschirm) Keine Mausaufnahme

Ich habe mit einem immer im Vordergrund befindlichen Fenster begonnen und den Fensterstil auf none gesetzt und den Hintergrund- und Transparenzschlüssel auf weiß gesetzt. In diesem Fenster gibt es eine Beschriftung mit einer großen Schrift, die die Warnmeldung enthält (später werde ich wahrscheinlich das Paint-Ereignis überschreiben und die Nachricht mit GDI malen). Ich benutze einen Timer, um die Nachricht einzublenden, indem ich ihre Deckkraft anwähle, bevor ich sie wieder zurückgebe. Es funktioniert insofern, als der Fokus nicht von irgendwelchen Apps gestohlen wird, sondern das transparente Formular die Mausereignisse erfasst, nicht das darunter liegende Formular (tatsächlich erfasst das meiste Formular, das transparent ist, nicht die Mausereignisse, nur der Beschriftungstext).

Auch ich bin mir nicht sicher, ob es der optimale Ansatz ist, vielleicht sollte ich irgendwie direkt auf den Bildschirm malen.

Wie sollte ich Dinge verbessern.

Antwort

10

Überschreiben Sie die CreateParams-Eigenschaft für Ihre Form-Klasse, und stellen Sie sicher, dass der erweiterte WS_EX_NOACTIVATE-Stil festgelegt ist. Mine sieht wie folgt aus:

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; 
    } 
} 

Werte für ExtendedWindowStyles verwendet oben sind:

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

Danke, slim-Code. Das funktioniert gut für mich. –

Verwandte Themen