Tooltipps registrieren


Unser Tooltipp-Fenster kann glücklicherweise mehr als einen Tooltipp beinhalten. Es ist also nicht erforderlich, für jeden Tipp ein eigenes Fenster zu erzeugen. Wenn wir einen Tooltipp registrieren wollen, benötigen wir die Nachricht TTM_ADDTOOL, der wir als lParam einen Zeiger auf das TToolInfo-Record übergeben.

Wie in solchen Fällen üblich, müssen wir vor dem Aufruf erst einmal die Größe des Records festlegen:

ti.cbSize   := sizeof(TToolInfo);

Des Weiteren benötigen wir das Handle des Elements, dem wir den Tooltipp zuordnen wollen. Und weil unser Tipp auch an der richtigen Stelle erscheinen soll, benötigen wir außerdem noch die Maße des jeweiligen Elementes:

// Fenster-Handle (= Control)
ti.hwnd     := wnd;
ti.uId      := wnd;
// Maße des Fensters GetClientRect(wnd,ti.Rect);

Ein Wort vielleicht noch zu den Flags:

ti.uFlags   := TTF_SUBCLASS or TTF_IDISHWND;
Flag Bedeutung
TTF_SUBCLASS Maus-bezogene Nachrichten werden automatisch an das Tooltipp-Fenster weitergeleitet
TTF_IDISHWND Die Wert von "uID" entspricht dem Fenster-Handle


Hinweis

Da wir hier typische Controls (Buttons, Eingabefelder usw.) verwenden, können wir auf das Bearbeiten der Maus-bezogenen Nachrichten verzichten. Diese werden durch das Flag "TTF_SUBCLASS" automatisch vom Control an das Tooltipp-Fenster weitergeleitet.

Das funktioniert (laut PSDK) nicht, wenn ein Programm z.B. ein System-definiertes Fenster nutzt. In einem solchen Fall werden die Nachrichten an dieses System-Fenster und nicht an das Programm geschickt. Man müsste also nicht nur die Nachrichten abfangen, es wäre auch erforderlich, die Anzeige und Positionierung der Tooltipps selbst zu übernehmen.
Da es aber in den meisten Fällen darum gehen dürfte, Tooltipps für die Controls des selben Programms einzublenden, sparen Sie mit dem o.g. Flag eine Menge Arbeit.

Das ganze übergeben wir dann mit der schon genannten Nachricht an das Tooltipp-Fenster:

SendMessage(hToolTip,TTM_ADDTOOL,0,LPARAM(@ti));

Damit wir diesen Code nicht für jedes Element schreiben müssen, bietet sich eine eigene Funktion oder Prozedur an, die wir aufrufen können. Sie finden sie im Beispielprogramm als "AddToolTip". Der Prozedur übergeben Sie das Handle des gewünschten Controls, die Anwendungsinstanz (in dem Fall also immer hInstance) und natürlich den Text, den Sie als Tooltipp sehen wollen, und der im Beispiel als Konstante deklariert ist:

AddToolTip(hEdit,hInstance,TIPP_EDIT);
Hinweis

Wenn wir mit Dialog-Ressourcen arbeiten, müssen wir ein klein wenig anders vorgehen. Da wir nur das Handle unseres Dialogs haben und lediglich über eine ID auf das gewünschte Element zugreifen können, verwenden wir die Funktion "GetDlgItem", um an das Handle des Elements heranzukommen. Als Beispiel gehen wir davon aus, dass das Dialog-Handle der Variablen "hDlgWnd" zugeordnet ist, und dass unser Eingabefeld die ID "120" hat. Der Aufruf sieht dann so aus:

AddToolTip(GetDlgItem(hDlgWnd,120),hInstance,TIPP_EDIT);