ToolTips verwenden



  • Erstmal vielen Dank!
    Ich habs dann mal so wie im Link beschrieben versucht, aber es tauchen immer noch keine Tooltips auf 😕
    Mein Code:

    // Tooltips anlegen
    	m_ttipctrl.Create(this); 
    	m_ttipctrl.AddTool(GetDlgItem(IDC_STATIC_VERSCHIEBEN),"Verschieben"); 
    	m_ttipctrl.AddTool(GetDlgItem(IDC_STATIC_GROESSE_AENDERN),"Größe ändern"); 
    	m_ttipctrl.AddTool(GetDlgItem(IDC_STATIC_BEENDEN),"Programm beenden");
    	m_ttipctrl.Activate(TRUE);
    
    	CDialog::OnInitDialog();
    
    BOOL CStartdialog3Dlg::PreTranslateMessage(MSG* pMsg) 
    {
    	if (m_ttipctrl.GetSafeHwnd()!=NULL && 
        pMsg->message>=WM_MOUSEFIRST && pMsg->message<=WM_MOUSELAST) 
        { 
    		//AfxMessageBox("ToolTip!");
            m_ttipctrl.RelayEvent(pMsg); 
        }
        return CDialog::PreTranslateMessage(pMsg);
    }
    


  • Lexaja schrieb:

    ...(für drei Static-Controls)...

    afaik ist es nicht moeglich statics mit einem tooltip zu versehen





  • Hallihallo!

    Danke schön 😃 Ich wollte gerade schreiben, dass ich die Lösung gefunden habe 😉
    Wenn ich SS_NOTIFY hinzufüge, funktioniert alles prima!



  • Ups, jetzt hab ich aber doch noch ein Problem.
    Die drei Static-Controls sind runde Regionen, in denen der Benutzer den Dialog vergrößern, verschieben oder beenden kann. Mit

    UINT CStartdialog3Dlg::OnNcHitTest(CPoint point)
    

    wird die Position des Mauszeigers abgefragt. Befindet er sich in der entsprechenden Region, wird eine ID zurückgegeben, die die auszuführende Aktion beinhaltet.
    Jetzt kann ich aber nicht mehr in meine Region klicken (also es passiert nichts). Ich vermute mal, dass die Nachricht jetzt schon vorher abgefangen wird?


  • Mod

    Wenn SS_NOTIFY gesetzt wird, dann wird auch die Mausnachricht an das Static gesendet und nicht mehr transparent an das parent weitergeleitet!



  • Kann ich die Mausnachricht denn wieder zurück an das Parent geben?
    Meine OnNcHitTest-Methode sieht so aus:

    UINT CStartdialog3Dlg::OnNcHitTest(CPoint point)
    {
    	ScreenToClient(&point);
    
    	// Eckpunkte des Dialogs erzeugen
    	CPoint d1(offset, runden(0.1 * (double)offset));
    	CPoint d2(2 * offset, runden(0.1 * (double)offset));
    	CPoint d0(d1.x - hilfskante, d1.y + hilfskante);
    	CPoint d3(d2.x + hilfskante, d2.y + hilfskante);
    	CPoint d4(d3.x, d3.y + kantenlaenge);
    	CPoint d5(d2.x, d4.y + hilfskante);
    	CPoint d6(d1.x, d5.y);
    	CPoint d7(d0.x, d4.y);
    
    	// Regionen holen
    	CRgn rgnDialogZiehen, rgnDialogVergroessern, rgnBeenden;
    	CRect rect;
    	GetClientRect(&rect);
    	rgnDialogZiehen.CreateEllipticRgn(d1.x - runden(0.1 * (double)offset), 0, d1.x + runden(0.1 * (double)offset), d1.y + runden(0.1 * (double)offset));
    	rgnDialogVergroessern.CreateEllipticRgn(d5.x - runden(0.1 * (double)offset), d5.y - runden(0.1 * (double)offset), d5.x + runden(0.1 * (double)offset), d5.y + runden(0.1 * (double)offset));
    	rgnBeenden.CreateEllipticRgn(d2.x - runden(0.1 * (double)offset), d2.y - runden(0.1 * (double)offset), d2.x + runden(0.1 * (double)offset), d2.y + runden(0.1 * (double)offset));
    
    	if(rgnDialogZiehen.PtInRegion(point))
    	{
    		return HTCAPTION;
    	}
    
    	if(rgnDialogVergroessern.PtInRegion(point))
    	{
    		return HTBOTTOMRIGHT;
    	}
    
    	if(rgnBeenden.PtInRegion(point))
    	{
    		return HTSYSMENU;
    	}
    
    	return CDialog::OnNcHitTest(point);
    }
    

    Hab ich das jetzt richtig verstanden, dass HTCAPTION, HTBOTTOMRIGHT oder HTSYSMENU dann an das Static weitergeleitet wird?


  • Mod

    Richtig und wenn Du HTTRANSPARENT returnierst gehen die Messages an das parent weiter.

    Bleibt für mich die Frage:
    Warum benutzt Du überhaupt CStatic und nicht ein CWnd und bist frei von aller Vorbelastung?



  • Wenn ich also die drei Statics einfach als CWnd anlege, müsste das einfach so ohne weitere Behandlungen gehen mit den Tooltips?
    Dann erstelle ich mir am besten eine eigene von CWnd abgeleitete Klasse, oder? Die OnPaint-Methode meiner Static-Klasse kann ich ja ohneweiteres übernehmen, oder?


  • Mod

    Ja sicher! Wenn Du auch noch OnPaint selber machst, frage ich mich wirklich warum Du überhaupt auf CStatic zurückgreifst.

    Das Problem ist einfach: Was möchtest Du?
    Das Control muss die Mausmessages bekommen um Tooltips anzeigen zu können. Andernfalls müsstest Du einfach im Parent die Tooltips hinzufügen und dort AddTool verwenden.



  • Am Anfang dachte ich, ein Static wäre ja super, um kleine Icons darin anzuzeigen.
    Seitdem ich aber aufgrund einiger Fehler und Probleme alles in der OnPaint-Methode selbst zeichne, kann ich genausogut CWnd-Objekte nehmen, das stimmt. Hab ich jetzt auch mal gemacht, aber es funktioniert immer noch nicht so einfach wie ich dachte!
    Also ich hab jetzt also ein CWnd-Objekt in meinem Dialog. In der OnInitDialog-Methode erstelle ich mein CWnd-Fenster, aktiviere die ToolTips und füge einen ToolTip für meine CWnd hinzu!

    ecke_verschieben->Create(NULL, _T(""), WS_CHILD | WS_VISIBLE, rcVerschieben, this, IDC_ECKE_VERSCHIEBEN);
    m_ttipctrl.Create(this);
    m_ttipctrl.AddTool(GetDlgItem(IDC_ECKE_VERSCHIEBEN), "Verschieben");
    	m_ttipctrl.Activate(TRUE);
    

    Dann habe ich noch folgende Methode implementiert:

    BOOL CStartdialog3Dlg::PreTranslateMessage(MSG* pMsg) 
    {
    	if (m_ttipctrl.GetSafeHwnd()!= NULL && pMsg->message == WM_MOUSEMOVE) 
        { 
            m_ttipctrl.RelayEvent(pMsg);
        }
        return CDialog::PreTranslateMessage(pMsg);
    }
    

    Jetzt werden mir ToolTips angezeigt, aber ich kann wiederum meinen Dialog nicht verschieben, da ich nie in die Methode NCHitTest meines Dialogs gelange, wenn der Mauszeiger über meinem CWnd-Objekt ist!
    Gebe ich in der Methode NcHitTest vom CWnd-Objekt HTTRANSPARENT zurück, kann ich meinen Dialog wieder verschieben, aber bekomme keine ToolTips mehr.
    Wo genau muss ich jetzt noch abfangen, dass ToolTips angezeigt werden? An welcher Stelle und mit welcher Methode? Muss ich das CToolTip-Objekt meinem CWnd zufügen?

    EDIT: Hab einfach mal probiert, die PreTranslateMessage-Funktion meines CWnd auch zu überschreiben und HTTRANSPARENT zurückzugeben, nutzt aber leider nichts!



  • Für alle die es interessiert:
    Ich habe nochmal ein bisschen rumgegoggelt und gesucht usw. und bin dabei auf das Projekt "NewLabel" bei Codeguru gestoßen. In dem Projekt ist eine Klasse CControlToolTip enthalten, die man wunderbar benutzen kann, um für Static-Controls ToolTips zu erzeugen!
    Einfach eine Variable vom Typ CControlToolTip in der CStatic-Klasse anlegen, alle gewünschten Funktionen einstellen und schon erscheint ein schöner ToolTip auf dem Bildschirm 😃


Anmelden zum Antworten