"on-mouseover" für MFC Objekte?

athlon

Mitglied
HI ich möchte gerne, dass wenn man im Programm über eine Checkbox oder einen Button mit der Maus drüberfährt dann in einem Textfeld eine genauere Beschreibung zu dem Button gegeben wird.
d.h. Der Button heißt "Beenden" und wennman die Maus draufhält soll in einem Textfeld erscheinen "Wennsie hier klicken wird das Programm beendet"

Wie kann ich sowas am einfachsten realisieren?
 
Dazu kannst du in CWnd::OnMouseMove() (der Handler für WM_MOUSEMOVE) prüfen, ob sich die Maus über dem Button befindet.

Es wäre allerdings noch eleganter, CToolTipCtrl zu verwenden. Beispiele findest du in der MSDN.
 
Puh..hab grad die MSDN durchgerattert - aber ich seh dort kein Land! Anerkennung für die von Euch die mit der MSDN (fast) jedes Problem lösen können...

Also, ich weiß nicht, wie man entweder
CWnd::OnMouseMove()
CToolTipCtrl
einbindet. Letzteres geht irgendwie über eine Membervariable - jedenfalls ist das in dem einen Beispiel der MSDN so gemacht worden.
Wie man da allerdings für den richtigen Button den richtigen Tooltip aktiviert ist mir schleierhaft...
 
Ich mach das folgendermaßen :


Code:
CToolTipCtrl m_pToolTip;

Variable in die C<Projektname>Dlg Headerdatei vom Dialog (oder SDI ?)

in der gleichnamigen cpp, in die OnInitDialog()

Code:
m_pToolTip.Create(this, TTS_ALWAYSTIP); 
 m_pToolTip.AddTool(GetDlgItem(IDC_BUTTON1),"Ich bin ein Tooltip");

m_pToolTip.AddTool() halt für alle Objekte ausführen für die du Tooltips hast.

und die Funktion PreTranslateMessage() überschreiben :

Code:
BOOL C<Projektname>Dlg::PreTranslateMessage(MSG* pMsg)
 {
 	if(IsWindow(m_pToolTip.m_hWnd))  
 	{  
 		m_pToolTip.RelayEvent(pMsg);  
 	}  
 
 	return CDialog::PreTranslateMessage(pMsg);
 }

<Projektname> natürlich durch deinen Projektnamen ersetzen ;)

Gruß & viel Erfolg
 
Jetzt muss ich aber selbst mal nachfragen, habe nämlich auch gerade ein Problem mit den Tooltips. Und zwar habe ich eine Toolbar wie folgt erstellt :

Code:
 CToolBar		 m_wndToolBar;
CImageList	  m_ilToolBar;

Code:
	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);


Die Tool Tips erstelle ich jetzt wie in dem Beitrag über mir, allerdings stürzt das
Programm mit einer Debug Assertion ab bei folgendem Befehl :

Code:
m_pToolTip.AddTool(m_wndToolBar.GetDlgItem(ID_SOUNDS),"Ich bin ein Tooltip")

Woran kann das liegen
 
Hab mein Problem auf eine sehr unerwartet einfache und schnelle Weise gelöst ;)

Und zwar so :

statt

Code:
m_wndToolBar->Create(this)

benutz ich jetzt :

Code:
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
 
Zurück