OnMouseMove in MainFrame & Tooltip Problem
-
Hi,
Erstmal eine Frage zu dem Ereignisshandler OnMouseMove(), füge ich den in der
MainFrame.cpp hinzu wird die NIE aufgerufen, sollte doch aber der Fall sein wenn
ich die Maus über das Menü, Toolbar etc. bewege oder ?! In der ChildView habe
ich auch diese Funktion, aber ist halt dort nur für den Clientbereich.jetzt mein 2. Problem :
Ich habe eine Toolbar, in der MainFrame wie folgt erstellt :
(MFC, SDI)CToolBar m_wndToolBar; CImageList m_ilToolBar;
m_wndToolBar.Create(this); m_wndToolBar.LoadToolBar(IDR_TOOLBAR1); HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_TOOLBAR1), IMAGE_BITMAP, 0,0, // cx,cy LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS ); CBitmap bm; bm.Attach(hbm); m_ilToolBar.Create(32,32, ILC_COLOR8, 1, 8); m_ilToolBar.Add(&bm,(CBitmap*)NULL); m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilToolBar);
Jetzt wollte ich Tooltips dazu erstellen und zwar hiermit :
CToolTipCtrl m_pToolTip; m_pToolTip.Create(this, TTS_ALWAYSTIP); m_pToolTip.AddTool(GetDlgItem(IDC_TOOLBARBUTTON1),"Ich bin ein Tooltip"); BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) { if(IsWindow(m_pToolTip.m_hWnd)) { m_pToolTip.RelayEvent(pMsg); } return CDialog::PreTranslateMessage(pMsg); }
Jetzt bekomme ich beim Start eine Debug Assertion aufgrund der Funktion
AddTool() ... woran kann das liegen ?!?
-
Weiß keiner Rat
??
Ich würde auch Vorschläge annehmen wie sich die Tooltips noch anders realisieren
würden. Ich hatte z.B. die Idee mit der OnMouseOver() die Position abzufragen
und dann "von Hand" Tooltips anzuzeigen. Nur dazu bräuchte ich eine Funktion um
die Mauszeiger Position im Mainframe abzufragen.
-
Hi!
Ich müßte den genauen ASSERT sehen, dann kann man nämlich mehr sagen.
Ein schöner Tooltip ist TfxDataTip, den kann man klasse erweitern und er geht auch für "nicht Dialoge".
Musste mal Google bemühen.
-
Erstmal eine Frage zu dem Ereignisshandler OnMouseMove(), füge ich den in der MainFrame.cpp hinzu wird die NIE aufgerufen, sollte doch aber der Fall sein wenn ich die Maus über das Menü, Toolbar etc. bewege oder ?!
Ist dieses MainFrame.cpp eine von nem Control abgeleitete Klasse, deine Hauptklasse oder einfach irgendne Generic Class? Wenn es z.B. von einem CEdit abgeleitet ist kommst du nur ins OnMouseMove rein wenn man über dieses CEdit drüberfährt. Wenns der Dialog ist sollte es eigentlich immer reagieren
Deshalb denk ich dass es einfach ne normale Klasse ist.
-
Danke für den Tip estartu, wed mich mal zu TfxDataTip erkundigen!
Wegen der Assertmeldung schau ich auch nochmal und poste sie dann hier.@Pulse :
MainFrame ist von CFrameWnd abgeleitet. Gibt ja immer so 3 Sachen bei ner SDI
Anwendung, ChildView, MainFrame und App, kenn mich noch ned so aus.Gruß
paddy
-
Ach so, DAS MainFrame. Wenn du auf Mausbewegungen reagieren möchtest musst du dein OnMouseMove ins CDeinNameView reinpacken...
-
In der ChildView hab ich auch die OnMouseMove() drin, aber die wird nur aufgerufen wenn man den Zeiger im Clientbereich bewegt. Geh ich ins Menü oder auf die Toolbar wird die Funktion gar nicht mehr aufgerufen
-
Du hast dir die Lösung schon gesagt, auch wenn du es nicht gemerkt hast.
WM_MOUSEMOVE reagiert auf alles im Clientbereich.
Für alles außerhalb (was aber noch deine Anwendung betrifft) gibt es WM_NCMOUSEMOVE (NC == NonClientArea)Versuch das mal.
-
Morgen! ahh cool danke wusste gar ned was diese NC Messages sind
Wieder was gelernt.
Erstmal danke für eure Hilfe, ich hab mein Problem gestern Abend allerdings noch auf eine sehr unerwartet einfache und schnelle Weise gelöstUnd zwar so :
statt
m_wndToolBar->Create(this)
benutz ich jetzt :
CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)
So, allein damit gingen die Tooltips noch ned. Jetzt kommt der springende Punkt
Im Resourceneditor für die Toolbar, hat man ja unter Eigenschaften das Feld "Auffordern", wo man den Tooltip Text eingeben kann. Gebe ich da z.B.
"testtip" ein geht es immer noch ned, aber mache ich es so hier :
"testtip\nIch bin ein Tooltip"
dann zeigt er wenn ich über den jeweilige Toolbar Button mit der Maus fahre
den Text hinter dem "\n" an. Hatte ich durch Zufall rausgefunden, recht komischIch glaub den Text vor dem \n benutzt er für die Statusleiste. Na jedenfalls
musste ich gar keine Tooltip Behandlung erst selbst einbauen und das ganze CToolTipCtrl und die Funktionen dazu konnte ich alle weglassen.Gruß
paddy