Pass-Through-Maus-Ereignisse zu übergeordneter Steuerung
-
23-08-2019 - |
Frage
Umgebung: .NET Framework 2.0, VS 2008
. Ich versuche, eine Unterklasse von bestimmtem .NET-Steuerelemente (Label, Panel) zu erstellen, die durch bestimmte Mausereignisse (MouseDown
, MouseMove
, MouseUp
) zu seiner übergeordneten Steuerung (oder alternativ zu der Top-Level-Form) übergeben wird. Ich kann dies tun, indem Prozeduren für diese Ereignisse in Instanzen der Standardsteuerungen zu schaffen, z.
public class TheForm : Form
{
private Label theLabel;
private void InitializeComponent()
{
theLabel = new Label();
theLabel.MouseDown += new MouseEventHandler(theLabel_MouseDown);
}
private void theLabel_MouseDown(object sender, MouseEventArgs e)
{
int xTrans = e.X + this.Location.X;
int yTrans = e.Y + this.Location.Y;
MouseEventArgs eTrans = new MouseEventArgs(e.Button, e.Clicks, xTrans, yTrans, e.Delta);
this.OnMouseDown(eTrans);
}
}
Ich kann die Event-Handler in eine Unterklasse der Steuerung bewegen, weil die Methoden, die die Ereignisse in der übergeordneten Steuerung erhöhen geschützt sind, und ich habe keine Qualifikation für die übergeordnete Steuerung:
kann nicht geschützt Mitglied Zugriff
System.Windows.Forms.Control.OnMouseDown(System.Windows.Forms.MouseEventArgs)
über einen Qualifier vom TypSystem.Windows.Forms.Control
; der Qualifier muß (davon abgeleitet oder) vom TypTheProject.NoCaptureLabel
sein.
Ich suche die WndProc
Methode der Steuerung in meiner Unterklasse in überschreiben, aber hoffentlich kann mir jemand eine sauberere Lösung.
Lösung
Ja. Nach vieler Suche fand ich den Artikel „Floating Controls, Tooltip-style“ , die WndProc
verwendet die Nachricht von WM_NCHITTEST
zu ändern HTTRANSPARENT
, so dass die Control
transparent auf Mausereignisse.
Um das zu erreichen, erstellen Sie eine Kontrolle von Label
geerbt und einfach den folgenden Code hinzu.
protected override void WndProc(ref Message m)
{
const int WM_NCHITTEST = 0x0084;
const int HTTRANSPARENT = (-1);
if (m.Msg == WM_NCHITTEST)
{
m.Result = (IntPtr)HTTRANSPARENT;
}
else
{
base.WndProc(ref m);
}
}
Ich habe dies in Visual Studio 2010 mit .NET Framework 4 Client Profile getestet.
Andere Tipps
Sie müssen eine öffentliche / geschützte Methode in Ihrer Basisklasse schreiben, die das Ereignis für Sie erhöhen. Dann rufen Sie diese Methode von der abgeleiteten Klasse.
oder
Ist das, was Sie wollen?
public class MyLabel : Label
{
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
//Do derived class stuff here
}
}
Das WS_EX_TRANSPARENT
erweiterte Fenster Stil dies tatsächlich tut (es ist, was in-place Tooltips verwenden). Man könnte diese Art betrachten wollen Anwendung anstatt Codierung viele Handler es für Sie tun.
Um dies zu tun, überschreiben die CreateParams
Methode:
protected override CreateParams CreateParams
{
get
{
CreateParams cp=base.CreateParams;
cp.ExStyle|=0x00000020; //WS_EX_TRANSPARENT
return cp;
}
}
Für weitere Lesung: