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 Typ System.Windows.Forms.Control; der Qualifier muß (davon abgeleitet oder) vom Typ TheProject.NoCaptureLabel sein.

Ich suche die WndProc Methode der Steuerung in meiner Unterklasse in überschreiben, aber hoffentlich kann mir jemand eine sauberere Lösung.

War es hilfreich?

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:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top