CToolTipCtrl bei einer eigenen visuallen klasse verwenden
-
hallo zusammen,
ich stehe vor folgender herausforderung:
ich habe eine anwendung, in welcher ich mit einem CToolTipCtrl tooltips anzeigen lasse. das funktioniert soweit auch gut. allerdings habe ich ein eigenes control darin, welches von cstatic abgeleitet ist. ich habe darin eine eigene onpaint welche eine kurve darstellt. auf dem dialog habe ich zur entwurfszeit eine cstatic platziert, welche als membervariable meine abgeleitete klasse hat.
darstellung funktioniert wunderbar, aber ich bekomme keinen tooltip angezeigt.ich habe versucht das m_hwnd zu verwende, ebenso wie getdlgitem(id des im designer eingefügtes static)
kann mir jemand sagen, wieso ich darüber keinen tooltip bekomme?
danke schonmal für eure tipps
ks
-
Es geht genauso wie bei anderen Controls auch.
Setze den Stil SS_NOTIFY sonst werden von diesem Contrl keine Mausnachrichten nehadelt und auch keine Tooltips angezeigt.
Allerdings war Deine Wahl das Control von CStatic abzuleiten semioptimal. Warum hast Du nicht direkt von CWnd abgeleitet.
-
ahhh, danke, das war es, ich hab vergessen bei dem das notify zu aktivieren.

warum cstatic, keine ahnung. ich wollte es eh visuell platzieren und die onpaint benutzen, da dachte ich zuerst an cstatic.
aber mal noch eine frage zu ctooltipctrl. wieso bekomme ich den TTS_CLOSE nicht angezeigt? ich habe folgende create:
m_pToolTip->Create(this,TTS_BALLOON | TTS_USEVISUALSTYLE | TTS_CLOSE | WS_POPUP | WS_EX_TOOLWINDOW);bleibt das fenster dann immer stehen bis ich den button schließe oder geht es auch mal von alleine weg? alles andere ging, nur den closebutton bekomm ich komischer weise nicht

Edit:
Ok, ich habe bemerkt das er mit den button nur anzeigt, wenn ich auch ein title setze, aber das fenster geht dennoch von ganz allein zu. und wenn ich versuche die maus zum kreuz zu bewegen, geht es gleich weg.
irgendwas hab ich noch vergessen
-
Der Tooltp verschwindet weil TTM_RELAYEVENT verwendet wird und dort sowohl das zerstören wie auch das Anzeigen geregelt wird.
Wenn Du also den Cursor über ein Element bewgest, dass diesen Tooltip anders bedient wird er geschlossen. Das ist eben das Verhalten. Daran ändert TTS_CLOSE nichts.Siehe Doku:
When a ToolTip control receives a WM_MOUSEMOVE message, it determines whether the mouse pointer is in the bounding rectangle of a tool. If it is, the ToolTip control sets a timer. At the end of the time-out interval, the ToolTip control checks the position of the pointer to see if it has moved. If it hasn't, the ToolTip control retrieves the text for the tool and displays the ToolTip. The ToolTip control continues to show the window until it receives a relayed button-up or button-down message or until a WM_MOUSEMOVE message indicates that the pointer has moved outside the bounding rectangle of the tool.
-
mit anderen worten, ich muss wenn ichs anders haben will, eine eigene klasse von CToolTipCtrl ableiten und es anders händeln.
Dann danke nochmal für deine schnelle Hilfe
-
Jein! Für mich stellt sich die Frage wer das Tooltip über TTM_RELAYEVENT auflöst.
Rufst Du TTM_RELAYEVENT auf? Wenn ja hast Du hier das Problem. Du willst das es angezeigt wird, aber nicht das es zerstört wird...
-
ich habe vor jahren, als ich mit vc6 angefangen hab mir folgendes aufgeschrieben, danach habe ich es heute wieder in eine neues projekt mit vs2008 eingebaut:
Tooltips in einer CDialog-Anwendung anzeigen
-der APP-Klasse folgende zwei Membervariablen zuweisen:CToolTipCtrl *m_gpToolTip; HWND m_hwndDialog;-der APP-Klasse die virtuelle Funktion "ProcessMessageFilter" hinzufügen
-in dieser Funktion folgenden Code einfügen:if (m_hwndDialog != NULL) if (lpMsg->hwnd == m_hwndDialog || ::IsChild(m_hwndDialog, lpMsg->hwnd)) { if (m_gpToolTip != NULL) m_gpToolTip->RelayEvent(lpMsg); }-im Konstruktor der App-Klasse die variablen leeren
//für ToolTips m_hwndDialog = NULL; m_gpToolTip = NULL;-der Dialog-Klasse folgende Membervariable hinzufügen:
CToolTipCtrl *m_pToolTip;-im Konstruktor die Variable wieder leeren
m_pToolTip=NULL;-im Destruktor oder in der OnDestroy den ToolTip freigeben
//ToolTip freigeben if (m_pToolTip !=NULL) delete m_pToolTip;-Beachten Sie, dass für jedes Steuerelement (oder jedes mit GetDlgItem holen), welches ToolTips erhalten soll, eine Membervariable von dessen Klasse vorhanden sein muss!
-nun nur noch in der OnInitDialog-Funktion die Tooltips initialisieren://ToolTips initialisieren if (!m_pToolTip) { int rt; m_pToolTip=new CToolTipCtrl; rt=m_pToolTip->Create(this); ASSERT(rt != 0); //nur für Debug ((CTestZipDlgApp*)AfxGetApp())->m_gpToolTip=m_pToolTip; //für jedes Steuerelement welches einen ToolTip erhalten soll, hier eine Zeile einfügen rt=m_pToolTip->AddTool(&m_NewArchivButton,"Erstellt ein neues ZIP-Archiv"); ASSERT(rt != 0); rt=m_pToolTip->AddTool(&m_ArchivOpenButton,"Öffnet ein vorhandenes ZIP-Archiv"); ASSERT(rt != 0); rt=m_pToolTip->AddTool(&m_AddFiles,"fügt dem geöffneten Archiv Dateien hinzu"); ASSERT(rt != 0); rt=m_pToolTip->AddTool(&m_ExtractFiles,"entpackt die ausgewählten Dateien"); ASSERT(rt != 0); m_pToolTip->Activate(TRUE); } ((CTestZipDlgApp*)AfxGetApp())->m_hwndDialog=m_hWnd; //Ende ToolTip initialisierenfunktioniert ja auch alles prima, nur wollte ich heute eins haben, welches ich durch diesen schließen button schließe und nicht von allein.
also JA, ich rufe relayevent auf. wie kann ich denn sonst machen das es angezeigt wird?
-
TTM_RELAYEVENT ist auch das Problem, dass er verschwindet!
Wenn das Tooltip durch einen Hover mit der Maus erzeugt wird, dann wird es auch durch eine Mausbewegung zerstört!Evtl. ist das anders, wenn Du das Tooltip selbst mit einem Befehl anzeigst...
IMHO musst Du also komplett auf RelayEvent verzichten.Ich hoffe ich habe mich einigermaßen verständlich ausgedrückt.
-
ich denke schon das ich dich verstanden habe. du meinst ich soll z.b. die mousemove in einer eigenen behandlung verarbeiten und darin dann das tooltip anzeigen. aber nur anzeigen und das schließen dann über den button im tooltip erledigen.
dann danke nochmal für deine hilfe, werde es bei gelegenheit mal probieren