Frage zu CToolTipCtrl (bzw. CreateWindowEx) für ListBox



  • Hallo zusammen,

    ich will zu jedem Element einer CListBox einen ToolTip anzeigen.
    Ich habe auch ein funktionierendes Beispiel aus dem Netz und auf VS 2019 übertragen.
    Da geht auch alles und zwar über die PreTranslateMessage(..).

    Bei mir ist es nun so, dass die PreTranslateMessage(..) schon in der App, übergeordnet
    existiert und dort auch brav werkelt. Aber dadurch ist sie für den Dialog abgeklemmt.
    Jedenfalls scheiterte der Versuch, sie in meinen Dialog einzubinden.

    Es existiert aber für meinen Dialog, in dessen Basisklasse, innerhalb der DoModal(),
    eine GetMessage(..) Schleife, die meine Message entgegennimmt. Ich verwende WM_RBUTTONDOWN.
    Über "::PostMessage(m_hWnd,WM_COMMAND,(BN_CLICKED<<16) | WM_RBUTTONDOWN,msg.lParam);"
    sende ich nun die in der Schleife empfangene Message an das OnCommand() meines Dialogs zurück.
    Ich empfange es dort auch.

    Ich passe es in der OnCommand() wieder der Message an, die in CBaseDialog::DoModal()
    empfangen wurde. Also Inhalt ist wieder identisch! Für Version 1 brauche ich die "msg" nicht.

    Ich habe als ToolTip zwei Varianten versucht: (Beide rufe ich dann in der "OnComand()" des Dialogs auf)
    Aber nichts funktioniert!

    1.  // Create a tooltip. Natürlich mit der nötigen Logik drumrum. Funktioniert so in einigen Views der Software!
       m_hwndTT = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, _T("ToolTipWindow"), 
                                 WS_POPUP | TTS_BALLOON | WS_CAPTION | TTS_NOPREFIX | TTS_ALWAYSTIP, 
                                 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
                                 hwndParent, NULL, NULL,NULL);
      
    2.  über CToolTipCtrl
       Leider aber reagiert mein CToolTipCtrl nicht auf das m_wndToolTip.RelayEvent(&msg)!
       Ein m_wndToolTip.Popup() hingegen lässt es kurz aufblitzen.
      

    Zu 2.
    Den POINT habe ich mit und ohne Anpassung probiert:
    m_pcListBox->ScreenToClient(&point);

    Was kann ich machen, damit es funktioniert?

    CBaseDialog::DoModal():
    	while ((iRet=GetMessage(&msg, NULL, 0, 0)) > 0) 
    	{	
    		...
    		if(msg.message == WM_RBUTTONDOWN) {
    			::PostMessage(m_hWnd,WM_COMMAND,(BN_CLICKED<<16) | WM_RBUTTONDOWN,msg.lParam);
    			TRACE("WM_RBUTTONDOWN(%d,%d,%d,%d,%d,%d)\n",msg.hwnd,msg.message,msg.lParam,msg.time,msg.pt.x,msg.pt.y);
    		}
    		...
    	
    //Mein Dialog: "class CListenEingabe : public CBaseDialog"
    BOOL CListenEingabe::OnCommand(WPARAM wParam, LPARAM lParam) 
    { 
        WORD	nCode = HIWORD ( wParam ); 
        WORD	nID = LOWORD ( wParam ); 
    	...
    	
        if ( nID == WM_RBUTTONDOWN ) { 
    		if (m_bAktivateToolTip && (m_wTypeToolTip > 0)) {
    			DWORD n;
    			POINT point;
    			MSG	  msg;
    			BOOL bOutside;
    			CString csTitle = _T("");
    			CString csContent = _T("");
    
    			msg = *GetCurrentMessage();
    			GetCursorPos(&point);
    			m_pcListBox->ScreenToClient(&point);
    			int nItem = m_pcListBox->ItemFromPoint(point, bOutside);
    			m_pcListBox->GetText(nItem, csContent);
    			msg.message = WM_RBUTTONDOWN;
    			msg.hwnd = m_pcListBox->m_hWnd;    // auch Handle des Dialogs probiert!
    			msg.lParam = lParam;// sind eigentlich schon identisch
    			msg.pt.x = point.x;
    			msg.pt.y = point.y;
    			TRACE("ListenEingabe::OnCommand(%d,%d,%d,%d,%d,%d)\n",msg.hwnd,msg.message,msg.lParam,msg.time,msg.pt.x,msg.pt.y);
    
    			if (!bOutside && nItem >= 0) {
    				m_pcListBox->GetText(nItem, csContent);
    				m_wndToolTip.AddTool(m_pcListBox, csContent);
    				m_wndToolTip.UpdateTipText(csContent, this);
    				m_wndToolTip.RelayEvent(&msg);	// nix passiert
    				//m_wndToolTip.Popup();			// Es blitzt kurz auf
    			}
    			if (bOutside)
    				m_wndToolTip.Invalidate();
    		}
        } 
    
        if (nID != WM_RBUTTONDOWN) // 08.02.24: ergänzt
    		return CBaseDialog::OnCommand(wParam, lParam);
    	else 
    		return TRUE;
    
    


  • Noch eine kurze Zusammenfassung:

    Bei mir laufen bereits "ToolTips" und zwar über die "PretranslateMessage()" in Views.
    Dies mit der obigen "CreateWindowEx(..)" Methode.

    Nun benötige ich sowas innerhalb eines Dialogs für eine "ListBox".
    Leider habe ich da die "PretranslateMessage()" nicht zum Laufen gebracht!
    Ich weiss leider nicht warum.
    So habe ich versucht, dies über eine Message-Schleife, in der "DoModal()" meiner
    Dialog-Basisklasse zu lösen und die an den "OnCommand()" meiner Dialogklasse weitergeleitet.
    Dort kommt die Message auch an.
    Der "ToolTip" wird aber, mit der Methode, die sonst funktioniert, nicht angezeigt.


Anmelden zum Antworten