2009-08-13 8 views
1

... Ist es möglich, Hot-Spots in C# zu erstellen, so dass ein Ereignis ausgelöst wird, wenn sich die Maus über einem bestimmten Bereich befindet?Erstellen von HotSpots in C#

Antwort

4

Ihr Standard-From-Objekt macht ein OnMouseMove-Ereignis verfügbar. Vorausgesetzt, dass Sie keine Kontrollen haben, wo die Hot Spots werden, Sie könnten nur die Koordinaten in diesem Fall behandeln:

 
protected override void OnMouseMove(MouseEventArgs mouseEvent) 
{ 
    string X = mouseEvent.X.ToString(); 
    string Y = mouseEvent.Y.ToString(); 

    //Add code here to match X & Y to your hot spot coordinates. 
} 
+0

Das ist in der Theorie gut, aber normalerweise möchte man, dass die Hotspots mit einigen Kontrollen überlappen. Und dann müssen Sie 'MouseMove' für alle Steuerelemente handhaben und die Mauskoordinaten entsprechend konvertieren. Und im Gegensatz zu WPF gibt es keine Möglichkeit, "Vorschau" Mausereignisse in WinForms zu bekommen ... –

+0

Danke dafür, sehr hilfreich! –

3

Erstellen Sie eine transparente Panel (wirklich transparent - durch das WS_EX_TRANSPARENT Bit in seinem erweiterten Fensterstil Einstellung - here's how), steckte es in die Position, die Sie auf anderen Kontrollen wollen, und behandeln MouseMove darauf.

+1

In WinForms gibt es kein wirklich transparentes Panel. Wenn Sie ein Panel so erstellen, wie Sie es beschreiben und mit anderen Controls/anderen Panels überlappen, sehen Sie tatsächlich den Formularhintergrund und nicht die Steuerelemente "hinter" Ihrem Panel. –

+2

@Eric, bitte lesen Sie meine Antwort noch einmal aufmerksam - besonders das bisschen über "wirklich transparent" und WS_EX_TRANSPARENT. Dann folge dem Link in der Antwort und lies das. Ich spreche insbesondere nicht über die Einstellung "Hintergrund" auf "Transparent", und ich habe darauf geachtet, dies in der Antwort klar zu machen. –

1

Fügen Sie eine MouseHover-Ereignisbehandlungsroutine für die Steuerelemente hinzu, die für Ihren Hotspot verwendet werden sollen.

+0

Vielen Dank, aber ich habe keine Kontrolle, wo ich den Hotspot haben möchte. Der Hotspot befindet sich irgendwo auf dem Hintergrund des Formulars ... –

+0

Siehe Sequ3L's Kommentar, Sie können dieses Ereignis auf Ihrem Formular behandeln. –

+1

baeltazor: Die Form ist auch eine Kontrolle. –

0

Sie können WndProc verwenden, um Windows-Nachrichten zu erfassen, oder Sie könnten GetCursorPos verwenden, um das zu bekommen Cursorposition auf dem Bildschirm.

+0

Und was gibt es genau dafür, wenn man nur 'MouseMove' behandelt? Warum sollte Win32 API überhaupt hier involviert sein (beachte, dass es sich um C#/WinForms handelt)? –

+0

WinForms hat keine "direkte" Unterstützung für diese Art von Aktion. Das erste Problem mit dem Panel ist, dass Sie keine nicht-rechteckige Region für die Erfassung von Ereignissen haben können. Das zweite Problem besteht darin, dass Sie, wenn Sie mehrere "Regionen" benötigen, möglicherweise mehr Panel-Panel-Steuerelemente hinzufügen müssen, um die Unordnung zu erhöhen. Außerdem unterstützen einige Steuerelemente das Empfangen von Ereignissen nicht, wenn ein anderes Steuerelement vorhanden ist, obwohl es transparent ist. –

+0

Wenn Sie etwas Leichtes haben möchten, sollten Sie die Win32-API in Betracht ziehen. –