MFC 中检查列表框控件中禁用复选框的工具提示

Posted

技术标签:

【中文标题】MFC 中检查列表框控件中禁用复选框的工具提示【英文标题】:Tool tip for disabled check boxes in Check List Box control in MFC 【发布时间】:2016-05-02 13:25:38 【问题描述】:

我正在使用 MFC Windows 应用程序。我在检查列表框控件中使用复选框。某些复选框被禁用。如何实现禁用复选框的工具提示?

【问题讨论】:

显示代码的相关部分。 你能实现启用复选框的工具提示吗? 【参考方案1】:

Ran Wainstein 实现了列表框控件中每个项目的工具提示。这也可以扩展到 Check List Box 控件。

MyCheckListBox.h

class CMyCheckListBox : public CCheckListBox

    DECLARE_DYNAMIC(CMyCheckListBox)

public:
  CMyCheckListBox();
  virtual ~CMyCheckListBox();
  afx_msg int OnToolHitTest(CPoint point, TOOLINFO * pTI) const;
  UINT ItemFromPoint2(CPoint pt, BOOL& bOutside) const;
  BOOL OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult );

protected:
  virtual void PreSubclassWindow();
  DECLARE_MESSAGE_MAP()
;   

MyCheckListBox.cpp 这仅适用于 Unicode 字符串。

IMPLEMENT_DYNAMIC(CMyCheckListBox, CCheckListBox)

BEGIN_MESSAGE_MAP(CMyCheckListBox, CCheckListBox)
  ON_NOTIFY_EX_RANGE(TTN_NEEDTEXT, 0, 0xFFFF, OnToolTipText)
END_MESSAGE_MAP()

void CMyCheckListBox::PreSubclassWindow() 
    CCheckListBox::PreSubclassWindow();
    EnableToolTips(TRUE);

int CMyCheckListBox::OnToolHitTest(CPoint point, TOOLINFO * pTI) const
    int row;
    RECT cellrect;  
    BOOL tmp = FALSE;
    row  = ItemFromPoint(point,tmp);  
    if ( row == -1 ) 
        return -1;
    GetItemRect(row,&cellrect);
    pTI->rect = cellrect;
    pTI->hwnd = m_hWnd;
    pTI->uId = (UINT)((row));  
    pTI->lpszText = LPSTR_TEXTCALLBACK;
    return pTI->uId;

BOOL CMyCheckListBox::OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult )
    TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
    CString strTipText;
    UINT nID = pNMHDR->idFrom;

    GetText( nID ,strTipText);
    lstrcpyn(pTTTW->szText, strTipText, 80);

    *pResult = 0;
  return TRUE;    

UINT CMyCheckListBox::ItemFromPoint2(CPoint pt, BOOL& bOutside) const
    int nFirstIndex, nLastIndex;
    nFirstIndex = GetTopIndex();
    nLastIndex = nFirstIndex  + GetCount(); 
    bOutside = TRUE;
    CRect Rect;
    int nResult = -1;
    for (int i = nFirstIndex; nResult == -1 && i <= nLastIndex; i++)
        if (GetItemRect(i, &Rect) != LB_ERR)
            if (Rect.PtInRect(pt))
                nResult  = i;
                bOutside = FALSE;
            
           
    
    return nResult;
  

最后在对应的对话框中实现Check List Box控件。输出为

【讨论】:

以上是关于MFC 中检查列表框控件中禁用复选框的工具提示的主要内容,如果未能解决你的问题,请参考以下文章

当鼠标悬停在 MFC C++ 中列表控件的列标题上时显示工具提示

VS2010-MFC(常用控件:静态文本框)

在MFC中:静态文本类;按纽类;编辑框类;滚动条类;列表框类;组合框类等所对应的类名以及其功能

MFC - 如何禁用列表项?

如何将复选框控件添加到 mfc 中的列表控件子项

如何根据 mfc 中的列表控件选择禁用按钮