• 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
    Name: %s
    Department: %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

    常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。

    昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
  • 相关阅读:
    scrapy学习(完全版)
    Python中模块与包的导入(朴实易懂版的总结)
    urllib.request.urlretrieve()用于下载制定url内容到本地
    IDEA自定义liveTemplates(方法模板、类模板)
    MySQL建表DDL规范(欢迎补充)
    15分钟搭建RocketMQ源码调试环境
    2500-使用MyBatis操作MySQL进行批量更新的注意事项
    手动注入bean到spring容器
    1000-ms-HashMap 线程安全安全问题
    1000-ms-maven相关问题
  • 原文地址:https://www.cnblogs.com/htj10/p/11704225.html
Copyright © 2020-2023  润新知