Frage zu CListCtrl-Tooltips



  • Ich hätte nicht gedacht, dass das hier so komplex wird.
    Kann das Projekt jetzt weitermachen, aber beim Holen des Textes für den Tooltip (GetToolTipText) ist pToolTipInfo immer noch 0:

    const CString CToolTip::GetToolTipText(UINT nItem, UINT nSubItem)
    {
    	if (nItem < 0 || nItem > 60)
    		return "";
    	ToolTipText *pToolTipInfo = reinterpret_cast<ToolTipText*>(GetItemData(nItem));
    	if (!pToolTipInfo)
    		return "";
    
    	if (nSubItem != 12 || nSubItem != 13 || pToolTipInfo == NULL)
    		return "";
    
    	return (nSubItem == 12) ? pToolTipInfo->strTxtNr : pToolTipInfo->strFlags;
    }
    

    Und das Füllen des Controls sieht so aus:

    void C...View::FillListCtrl()
    {
    	LVITEM lvItem;
    	lvItem.mask = LVIF_TEXT | LVIF_PARAM;
    	lvItem.pszText = "";
    	for (int i = 0; i < m_tool.GetHeaderCtrl()->GetItemCount(); i++)
    	{
    		lvItem.iItem = 0; lvItem.iSubItem = i;
    		m_tool.InsertItem(&lvItem);
    	}
            ...
        ToolText *pText = new ToolText;
        m_strData.Format("Text Nr. %i", cnt);
        pText->strTxtNr = m_strData;
    
    	m_strData.Format("Text Nr. %i", cnt);
    	pText->strFlags = m_strData;
    	lvItem.lParam = reinterpret_cast<LPARAM>(pText);
    	...
    }
    

    Mal davon abgesehen, dass ich in FillListCtrl durch das dauernde Anfordern Mem-Leaks kriege (was hier auch nur zum Test ist), kann ich es einfach nicht verstehen, wieso bei GetToolTipText pToolTipInfo immer 0 ist !

    Und bei

    void CToolTip::OnLvnDeleteitem(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
    	delete reinterpret_cast<ToolTipText*>(pNMLV->lParam);
    	*pResult = 0;
    }
    

    kriege ich ne Exception, weil lParam ungültig ist.
    Aber das Setzen des lParams in FillListCtrl ist erfolgreich !

    Irgendwas überseh ich hier, aber was ?



  • Ist m_Tool die Listenansicht? InsertItem sollte nur einmal pro Eintrag aufgerufen werden (also pro Zeile) und nicht für jede Spalte.

    Zudem musst Du lvItem.lParam natürlich auch vor dem entsprechenden InsertItem initialisieren und setzen. Im Nachhinein geht es nur über ein SetItemData.



  • Habe es grad mit SetItemData probiert (was eig auch nix anderes tut) und da funktioniert es.

    So ist es, m_tool ist eine Instanz von der Klasse CToolTip, die public von CListCtrl erbt.
    Ja, das stimmt natürlich, dass ich erst den lParam setzen muss, bevor ich InsertItem aufrufe!
    War irgendwie klar, dass es eine einfache Sache war.

    Fakt ist: jetzt funktioniert es endlich !! 🙂

    Ich danke dir vielmals für deine super, hilfreiche und dauernd verfügbare Hilfe ! 😃

    Noch nen schönen Tag.


Anmelden zum Antworten