Tooltip in Statuszeile umleiten?
-
Dankeschön.
Okay, gefunden habe ich es schon mal: http://msdn2.microsoft.com/en-us/library/xkd95027(vs.71).aspx

Jetzt müssen aber alle Tooltips in die Stringtable, oder?
Mist, die stehen alle direkt im Code... ja ich weiß, das macht man nicht aber ich habs gemacht.
-
Nein müssen sie nicht. lParam mit dem Zeiger bestücken und wParam auf NULL das wars!
-
Arg, hast Recht. Hab es beim Lesen wohl nicht ganz verstanden gehabt.
Vielen Dank, ich werde das am Montag mal testen.

-
Ähm, zum Testen fehlt mir noch was: Gibt es ne Nachricht "Mauszeiger ist über Control Nummer (siehe Parameter)"?

Weil irgendwann muss ich die WM_SETMESSAGESTRING ja senden und wissen, mit was ich die senden muss.
-
Man nehme einen Timer und kontrolliere einfach wo der Cursor aktuelle steht. ChildWindowFromPoint und WindowFromPoint helfen Dir.
Oder Du installierst einen Hook (finde ich für soetwas Overkill).
Oder Du beobachtest (nicht behandelst) WM_MOUSEMOVE im PreTranslateMessage des Parent.
-
Martin Richter schrieb:
Man nehme einen Timer und kontrolliere einfach wo der Cursor aktuelle steht. ChildWindowFromPoint und WindowFromPoint helfen Dir.
Aaah!

Manchmal isses so einfach und man kommt nicht drauf.

Ich werde wohl den Timer und SetFocus nehmen.
Super, jetzt kann ich endlich loslegen.

Martin Richter schrieb:
Oder Du beobachtest (nicht behandelst) WM_MOUSEMOVE im PreTranslateMessage des Parent.
Welchen Sinn hat denn eine reine Beobachtung?

-
Puh, also diese Casterei ist echt kompliziert.

So kompiliert es endlich:CString strTest = _T("Über Control"); AfxGetMainWnd()->SendMessage(WM_SETMESSAGESTRING, NULL, (LPARAM)(LPCTSTR)strTest);Jetzt kommen die Nachrichten aber nicht an.

Vermutlich, weil ich in der Basisklasse der Views bin. Gibt es da noch eine bessere Möglichkeit als PreTranslateMessage?Leider wird der Text nicht geändert. Wieso?
void CBasisView::OnTimer(UINT nIDEvent) { if ((nIDEvent == TIMER_TOOLTIP) && (m_nCtrlID)) { CString strTest = _T("Über Control"); AfxGetMainWnd()->SendMessage(WM_SETMESSAGESTRING, NULL, (LPARAM)(LPCTSTR)strTest); } else { CString strTest = _T("Nicht über Control"); AfxGetMainWnd()->SendMessage(WM_SETMESSAGESTRING, NULL, (LPARAM)(LPCTSTR)strTest); } CFormView::OnTimer(nIDEvent); }Es steht immer nur "test" drin, also was ganz anderes.

Ich habe mal auf das SendMessage je einen Breakpoint gesetzt und ich laufe da durch.
PS: Auch wenn ich was aus dem Stringtable nehme, steht nur "test" drin.

PPS: An der MFC Version liegt es auch nicht, mit VC2003 sehe ich auch keine Änderung.
-
Îst es nicht besser eine Klasse von CToolTipCtrl abzuleiten, und darin den Text in der Statusbar zu setzen, als mit einem Timer und PointInRect() auf das Problem loszugehen.
Gruß
-
CTecS schrieb:
Îst es nicht besser eine Klasse von CToolTipCtrl abzuleiten, und darin den Text in der Statusbar zu setzen, als mit einem Timer und PointInRect() auf das Problem loszugehen.
Gruß
Ja, klingt nicht uninteressant - aber erstmal müsste es überhaupt gehen.

-
Martin Richter schrieb:
Man nehme einen Timer und kontrolliere einfach wo der Cursor aktuelle steht. ChildWindowFromPoint und WindowFromPoint helfen Dir.
Oder Du installierst einen Hook (finde ich für soetwas Overkill).
Oder Du beobachtest (nicht behandelst) WM_MOUSEMOVE im PreTranslateMessage des Parent.Also, irgendwie klappt das noch nicht.
Die Nummern stimmen überhaupt nicht.
void CBasisView::OnMouseMove(UINT nFlags, CPoint point) { CWnd* pCtrl = ChildWindowFromPoint(point); if (pCtrl) { m_nCtrlID = pCtrl->GetDlgCtrlID(); CString strText; pCtrl->GetWindowText(strText); TRACE(_T("Ctrl ID: %d (%s)\n"), m_nCtrlID, strText); } else { // Kein Control -> Kein Tooltip! m_nCtrlID = 0; } CFormView::OnMouseMove(nFlags, point); }
-
Wenn Dein Control nicht Transparent ist, kann OnMouseMove keine Benachrichtigung für ein OnMouseMove bekommen, denn das bekommt immer das Control selbst.
Deshalb galt mein Hinweis auf PreTranslateMessage! Dann bekommt auch das Parent eine Chance!
-
Hmm, bei PreTranslateMessage weiß ich blos nie, wie ich da nun an die eigentlichen Parameter drankomme. In diesem Fall eben den Point. (Kennst du vielleicht was zu lesen mit Beispielen dazu?)
Ich habe gestern die MSDN von "vorne nach hinten" (okay, das nicht aber ziemlich lange und gründlich) durchstöbert und einfach keine Funktion gefunden, die mir im View die aktuelle Mausposition gibt.
Ich weiß es gibt sowas, aber ich finde es nicht.