Hint Texte sowohl als Baloon als auch in einem Label eines StatusStrips

CSANecromancer

Erfahrenes Mitglied
Halllo zusammen.

Ich habe ein kleines Problem mit einem Window.Forms Formular. Auf diesem Formular platziert sind u.a.:
- Ein ToolStrip (MyToolStrip)
- In MyToolStrip ein ToolStripButton (btFoobar), auf dem nur ein Icon angezeigt wird.
- In MyMenuStrip ein ToolStripStatusLabel (lbHintText)

Was ich gerne machen möchte:
Wenn der Mauszeiger auf btFoobar bewegt wird, soll ein kleiner ToolHint als Ballon angezeigt werden (z.B. "Foobar Hint") und gleichzeitig ein etwas ausführlicherer Hilfstext in lbHintText (z.B. "Löst Funktion Foobar aus.").

Gibt es eine Möglichkeit, wie ich zu ToolButtons, ToolStripMenuItems etc.pp. sowohl einen Baloon mit kurzem Hint als auch einen ausführlichen Hint Text im Statusstrip anzeigen kann, ohne daß ich für alle Komponenten die MouseHover-Events implementieren muß?
 

Shakie

Erfahrenes Mitglied
Die ToolTip-Klasse hat ein Popup-Ereignis. Das tritt ein bevor eine QuickInfo angezeigt wird. Mit Hilfe der AssociatedControl-Eigenschaft der PopupEventArgs kannst du feststellen für welches Control ein QuickInfo angezeigt werden soll und dann entsrpechend eine ausführliche Information in deinem Label anzeigen.
 

CSANecromancer

Erfahrenes Mitglied
Also zunächst einmal: Vielen Dank und - Wow! Wer soll denn bitte nur mit Hilfe der MSDN auf so eine Verwurschtelung kommen? :)

Also rein theoretisch erscheint mir die von dir empfohlene Vorgehensweise sehr schlüssig und geht auch in die Richtung dessen, was ich mir wünsche (zentrale Verwaltung der langen Hinttexte ohne riesige Event-Implementierung in 50+ Objekten), allerdings lässt sie sich nicht praktisch umsetzen.

Denn es geht mir ja um Tool Tip plus Infotext im Label für einen ToolStripButton. Und genau der lässt sich leider nicht mittels MyToolTip.SetToolTip(...) mit einem ToolTip-Objekt verbinden, da er nicht von Control sondern von ToolStrip abgeleitet ist. Zumindest habe ich bislang noch kein passendes type casting hinbekommen.

Hast du diesbezüglich evtl. noch eine Idee?
 

CSANecromancer

Erfahrenes Mitglied
Super!

Dein Vorschlag mit dem ToolTip-Objekt, PopUp-Event und Abfragen von AssociatedControl hat mir die passende Idee zur Lösung gegeben. Ich poste sie mal, bitte aber um etwas Nachsicht, da ich zwar mit Windows.Forms arbeite, aber nicht mit C# oder VB.net sondern Delphi, d.h. die Syntax ist ein bißchen anders, als evtl. gewohnt. Aber das Prinzip sollte erkennbar sein und sich dann auch auf andere Sprachen umsetzen lassen:

Im Header meines Formulars definiere ich eine einzige allgemein gültige MouseHover-Methode:
Code:
type
  dlgCameraView = partial class(System.Windows.Forms.Form)
  
  private
    ...
    method MouseHover(sender: System.Object; e: System.EventArgs);
    ...

Außerdem ist das Load-Event des Formulars implementiert und beinhaltet eine zentrale Zuweisung von MouseHover-Events zu allen relevanten Komponenten, also so z.B.:

Code:
method dlgCameraView.dlgCameraView_Load(sender: System.Object; e: System.EventArgs);
begin
...
  mmCamera.MouseHover           += new System.EventHandler(@MouseHover);
  mmParameter.MouseHover        += new System.EventHandler(@MouseHover);
  btCameraGetPicture.MouseHover += new System.EventHandler(@MouseHover);
...
end;

Dabei sind mmCamera und mmParameter Einträge im Hauptmenü vom Typ ToolStripMenuItem und btCameraPicture ist ein Tool Button, logischerweise vom Typ ToolStripButton.

Weiter unten im Code dann die Implementierung der allgemeinen MouseHover-Methode:
Code:
method dlgCameraView.MouseHover(sender: System.Object; e: System.EventArgs);
begin
  if sender = mmCamera then
    StatusHintLine.Text := 'Hilfetext Kamera';

  if sender = mmParameter then
    StatusHintLine.Text := 'Hilfetext Parameter';

  if sender = btCameraGetPicture then
    StatusHintLine.Text := 'Hilfetext Kamera GetPicture';

  StatusHintLine.Invalidate();
end;
StatusHintLine ist dabei das ToolStripStatusLabel. Ok, es sind noch Testtexte und die if-Abfragen gehen wohl auch noch sauberer, aber auf alle Fälle funktioniert das schon mal so, wie ich es mir wünsche.

Vor allem habe ich sämtliche Event-Handler für die MouseHover zentral gesammelt und nur eine einzige Methode dazu, so daß ich an nur zwei Stellen im Source nachschauen muß (Codeblock mit den ganzen Zuweisungen der MouseHover-Eventhandler und die MouseHover-Methode selbst) und mich nicht noch mit dem Designer rumschlagen muß ("ist MouseHover auch wirklich für die Komponenten eingetragen...?"), wenn ein Hinttext nicht funktioniert. :)