2009-05-19 9 views
2

Es scheint hier eine ähnliche Frage zu sein, aber mit dem "entgegengesetzten" Problem (Er wollte keine Mausereignisse erfassen).(C#) Windows Forms - Transparenter Hintergrund beim Erfassen von Mausereignissen?

Ich habe ein Formular mit einem Panel. Das Fenster ist grenzenlos und auf die exakte Größe des Panels eingestellt (in jeder Hinsicht ist es so, als wäre das Panel "frei schwebend"). Ich kann die BackColor des Bedienfelds auf SystemColors.Control festlegen und dann den TransparencyKey des Fensters auf denselben Wert einstellen. Dies funktioniert, indem es den gewünschten Effekt (Transparenz) erreicht, aber das Panel kann keine Mausereignisse mehr erfassen (was für die Funktionalität entscheidend ist)!

Gibt es einen anderen Weg, um die Mauserfassung wieder zu aktivieren?

Ich habe versucht, das OnPaintBackground zu überschreiben und einen Noop zu machen, aber das hat keine echte Transparenz erreicht, da der Hintergrund nach jedem Tick nicht aktualisiert wird (also bleibt egal, was hinter dem Panel bei der ersten Ziehung ist) Sie bewegen das Panel oder aktualisieren es auf andere Weise). Es ermöglichte dem Panel jedoch, Mausereignisse zu erfassen.

Das ist in diesem Stadium des Projekts nicht besonders mühsam, aber ich bin während eines schnellen Prototyps über das Problem gestolpert und es nervt mich jetzt. Wenn jemand irgendwelche Hinweise hat, würden sie sehr geschätzt werden.

Antwort

1

Wenn Sie VC++ verwenden, würde ich sagen, dass Sie eine Nachrichtenpumpe benötigt, um WM_ Maus Ereignismeldungen zu verarbeiten.

Eine schnelle Suche zeigt diesen Thread die Ihnen von Nutzen sein können:

Capturing ALL mouse events

Ich gehe davon aus, dass Sie bereits versucht, mit dem folgenden:

/// <summary> 
/// A transparent control. 
/// </summary> 
public class TransparentPanel : Panel 
{ 
    public TransparentPanel() 
    { 
    } 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams createParams = base.CreateParams; 
      createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT 
      return createParams; 
     } 
    } 

    protected override void OnPaintBackground(PaintEventArgs e) 
    { 
     // Do not paint background. 
    } 
} 
+0

Hallo ChrisBD - danke für deine Hilfe. Die obige Methode 'Art von' hat funktioniert. Ich werde weiter damit experimentieren und schauen, ob ich es schaffen kann. Danke nochmal! – Beardy

+0

gleiches Problem! Bitte aktualisieren Sie das Thema, wenn Sie die Lösung gefunden haben! – Pedro77

0

Ich habe nicht wirklich eine Antwort für Sie, aber ich habe einen anderen (vielleicht ein bisschen "hacky") Weg für Sie zu erreichen, was Sie versuchen zu tun.

Legen Sie die Eigenschaft Forms Opacity auf 1% (nicht mit dem Transparenzschlüssel) und jetzt wird es die Ereignisse erfassen. Das Formular wird nicht sichtbar sein (zumindest auf meinem Computer bei 1% konnte ich es überhaupt nicht sehen) und Sie werden immer noch alle Mausklicks erfassen können.

+0

Hallo BFree - Danke für Antwort, aber leider ist dies für mich keine praktikable Option - da das Panel Kinderkontrollen hat, die sichtbar sein müssen. Danke trotzdem! – Beardy

+0

Ja, ich hatte Angst, dass du das sagst. Es tut uns leid! Viel Glück ... Ich bin eigentlich selbst neugierig, ob es eine Lösung gibt. – BFree