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öst 😉

    Und 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 komisch 😉

    Ich 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


Anmelden zum Antworten