MFC之界面提示(CToolTipCtrl类)

实现如下:当鼠标放到一个控件上,就显示一个提示。

 

 关键代码:

在头文件TipDlg.h中添加成员变量:
CToolTipCtrl m_tip;

在对话框初始化中
BOOL CTipDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
       ...
    // TODO:  在此添加额外的初始化代码
    m_tip.Create(this);
    m_tip.AddTool(GetDlgItem(IDC_NUM), _T("Please add number in here."));
    m_tip.AddTool(GetDlgItem(IDC_NAME), _T("Please input name in here."));
    m_tip.AddTool(GetDlgItem(IDC_DEPT), _T("Please select department in here."));
    m_tip.AddTool(GetDlgItem(IDC_ADD), _T("ADD"));
    m_tip.AddTool(GetDlgItem(IDC_DEL), _T("DELETE"));
    m_tip.AddTool(GetDlgItem(IDC_MOD), _T("MODIFY"));
    m_tip.AddTool(GetDlgItem(IDC_LIST), _T("The information of employee."));
    m_tip.Activate(TRUE);

    m_list.InsertColumn(0, _T("Number"), 0, 100);
    m_list.InsertColumn(1, _T("Name"), 0, 120);
    m_list.InsertColumn(2, _T("Department"), 0, 120);
    m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

    LPCTSTR szDept[] = {
        _T("Human Resource"),
        _T("Reserch & Development"),
        _T("Finance"),
        _T("Testing")
    };
    int n = sizeof(szDept) / sizeof(szDept[0]);
    CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_DEPT);
    for (int i = 0; i < n; ++i)
        pComb->AddString(szDept[i]);

    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

3. 添加一个虚函数 PreTranslateMessage
BOOL CTipDlg::PreTranslateMessage(MSG* pMsg)
{
    // TODO:  在此添加专用代码和/或调用基类
    m_tip.RelayEvent(pMsg);//将鼠标消息传递给ToolTip控件进行处理。

    return CDialogEx::PreTranslateMessage(pMsg);
}
View Code

 

动态添加提示信息:

 

 

 关键代码:

1. 添加成员函数
    CString GetListText();
    BOOL SetTipText(UINT id, NMHDR *pHdr, LRESULT* pResult);
2. 手动添加消息映射
    ON_NOTIFY_EX(TTN_NEEDTEXT, 0, SetTipText)//自己添加
3. 在cpp文件中编写函数
CString CTipDlg::GetListText()
{
    POSITION ps = m_list.GetFirstSelectedItemPosition();
    int nn = m_list.GetNextSelectedItem(ps);
    int n=m_list.GetSelectedCount();
    if (n<1)
        return _T("no information.");
    int nSel = m_list.GetSelectionMark();
    CString str;
    str.Format(_T("Number: %s\r\nName: %s\r\nDepartment: %s"),
        m_list.GetItemText(nSel, 0), m_list.GetItemText(nSel, 1), m_list.GetItemText(nSel, 2));
    return str;
}

#pragma warning(disable:4996) // 可以使用 strcpy sprintf 等,而不是必须使用MS提供的安全函数 strcpy_s sprintf_s 等
BOOL CTipDlg::SetTipText(UINT id, NMHDR *pHdr, LRESULT* pResult)
{
    TOOLTIPTEXT *pText = (TOOLTIPTEXT*)pHdr;
    UINT nID = pHdr->idFrom;
    if (pText->uFlags & TTF_IDISHWND)
    {
        nID = ::GetDlgCtrlID((HWND)nID);
        switch (nID)
        {
        case IDC_LIST:
            //动态赋值提示文字,默认限于80个字符。
            //(超出80,出现崩溃
            // STATUS_STACK_BUFFER_OVERRUN encountered
            // Tip.exe 已触发了一个断点。)
            _tcscpy(pText->lpszText, GetListText());
            return TRUE;
        }
    }
    return FALSE;
}

若想显示多行,在OnInitDialog()中添加一句:
m_tip.SetMaxTipWidth(1000);
View Code

 

posted @ 2019-10-19 16:11  htj10  阅读(684)  评论(0编辑  收藏  举报
TOP