Tooltip auf CWnd erzeugen

chris_head

Mitglied
Hallo,

ich versuche jetzt schon einige Zeit einen Tooltip auf ein CEdit zu zaubern welches sich auf einem CWnd (KEIN CDialog und KEIN CView o.ä.) befindet. Leider bisher nicht von Erfolg gekrönt.
Gegooglet hab ich schon sehr intensiv. Ich finde aber nur Lösungen für CEdit (oder anders Ctrl) auf CDialog /CFormView / CView ect.

Kann mir jemand helfen?
PS: verwende MFC mit VC6
 

Endurion

Erfahrenes Mitglied
Zeig mal Code.

Da wirst du vermutlich das CWnd subclassen müssen und mit RelayEvent die Mouse/Tastatur-Nachrichten an das Tooltip-Control weitergeben müssen.
 

ks2

Grünschnabel
ich weiß zwar nicht ob es unbedingt hilft, aber ich habe mir mal dazu folgendes notiert:

Tooltips in einer CDialog-Anwendung anzeigen
-der APP-Klasse folgende zwei Membervariablen zuweisen:
Code:
	CToolTipCtrl *m_gpToolTip;
	HWND m_hwndDialog;
-der APP-Klasse die virtuelle Funktion "ProcessMessageFilter" hinzufügen
-in dieser Funktion folgenden Code einfügen:
Code:
	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
Code:
	//für ToolTips
	m_hwndDialog = NULL;
	m_gpToolTip = NULL;
-der Dialog-Klasse folgende Membervariable hinzufügen:
Code:
	CToolTipCtrl *m_pToolTip;
-im Konstruktor die Variable wieder leeren
Code:
	m_pToolTip=NULL;
-im Destruktor oder in der OnDestroy den ToolTip freigeben
Code:
	//ToolTip freigeben
	if (m_pToolTip !=NULL)
		delete m_pToolTip;
-Beachten Sie, dass für jedes Steuerelement, welches ToolTips erhalten soll, eine Membervariable von dessen Klasse vorhanden sein muss!
-nun nur noch in der OnInitDialog-Funktion die Tooltips initialisieren:
Code:
	//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 initialisieren
Theoretisch sollte es auch mit GetDlgItem anstatt der Membervariablen funktionieren.
 
Zuletzt bearbeitet:

chris_head

Mitglied
Mit Code zeigen wird schwer, weil sehr komplex. Ich versuchs mal sinnvoll zu kürzen :rolleyes: .

im Header:
Code:
...
class CMyDialog  : public CWnd
{
 public:
   CMyDialog();
 private:
   CEdit* m_myEdit;
   ...
}

zugehörige Source
Code:
CMyDialog::CMyDialog()
{
  m_myEdit = NULL
}
 ...
int CMyDialog::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
  if (-1 == CWnd::OnCreate(lpCreateStruct))
        return -1;
  m_myEdit = new CEdit;
  m_myEdit->Create(WS_CHILD | WS_VISIBLE | ES_LEFT,  CRect(125,20,165,40), this, IDC_MYEDIT);
  m_myEdit->ShowWindow(SW_SHOW);
...
}
...

Ich habe schon mehrere Varianten für die Tooltip-Erstellung ausprobiert.
Mit CTooltipCtrl und dem Ausführen des RelayEvent in PreTranslateMessage ging es in einem Beispiel mit CDialog. Aber mit CWnd funktionierte es nicht mehr.

Mit ist gerade aufgefallen ,dass PreTranslateMessage keine MausMessages verarbeitet :confused: . Deshalb habe ich versucht mit OnMouseMove die WM_MOUSEMOVE msg abzufangen und innerhalb dieser Fkt. RelayEvent aufzurufen. Dazu habe ich ne Dummy MSG gebaut.
Code:
MSG msg;
msg.message = WM_MOUSEMOVE;
und dann die ins RelayEvent gepackt. Leider immer noch kein Tooltip zu sehen :( . Muss ich die MSG mit allen Parametern füllen? Wenn ja mit welchen?

Hoffentlich reichen die Ausführungen jetzt ;) .
 
Zuletzt bearbeitet:

ks2

Grünschnabel
ich dachte immer cwnd wird nur für childwindows wie steuerelemente usw. verwendet.
tut mir leid, ich hab es bisher nur bei cdialog abgeleiteten klassen verwendet und hab jetzt nix anderes da zum testen
 

chris_head

Mitglied
Ich hab nach langem Hin und Her mich dazu durchgerungen für jedes Control, das ich benutze, eine eigene Klasse (jeweils abgeleitet von der eigentlcihen Klasse, also MyEdit von CEdit usw.) zu schreiben. In jeder Klasse implementere ich ein CToolTipCtrl und entsprechende Methoden zum Erstellen und ändern des Tooltips.
Das funktioniert erstmal. Ich finde es aber nicht sehr schön.
Außerdem wollte ich die ganzen Tooltipsachen in ne extra Klasse packen. Damit ich von der ToolTipKlasse erben kann (z.B. class MyEdit : public CEdit , public MyToolTip) . Leider habe ich die MyToolTip von CWnd abgeleitet, damit ich WM_MouseMove usw. abfangen kann. Dadurch kommt es zu Fehlern da ja Cedit und MyToolTip beide von CWnd abgeleitet sind und beim Übersetzen nicht genau bestimmt ist aus welcher Klasse eine CWnd-Methode aufgerufen werden soll. Kann mir da jemand nen schlauen Tipp geben? Am liebsten mit Lösungsansatz. :suspekt:
 
Zuletzt bearbeitet: