在SDI单文档视图中使用cmfctooltips

30 篇文章 4 订阅
10 篇文章 1 订阅

由来

在一个项目里,需要随时跟踪鼠标位置的坐标值,当然可以在状态栏里显示,也可以用tooltips的方式来显示,一般在tooltips一般在对话框里用,
这里记录下在单文档视图里的使用

平台

Win10 64bit
VS2015
MFC SDI/MDI

效果

这里写图片描述

主要原理

从CMFCToolTipCtrl派生出子类CCustomToolTipCtrl自绘

核心代码

class CCustomToolTipCtrl : public CMFCToolTipCtrl
{
// Construction
public:
    CCustomToolTipCtrl();

// Attributes
public:
    int m_nCurrID;
// Operations
public:

// Overrides
// Implementation
public:
    virtual ~CCustomToolTipCtrl();

protected:

    CSize OnDrawLabel(CDC* pDC,CRect rect,BOOL bCalcOnly);
};


CCustomToolTipCtrl::CCustomToolTipCtrl()
{
    m_nCurrID = 0;
}

CCustomToolTipCtrl::~CCustomToolTipCtrl()
{
}

CSize CCustomToolTipCtrl::OnDrawLabel(CDC* pDC, CRect rect, BOOL bCalcOnly)
{
//  TRACE("ENTER CCustomToolTipCtrl::OnDrawLabel bCalcOnly=%d\n", bCalcOnly);
    ASSERT_VALID(pDC);

    // my special tooltip drawing system for context sensitive tooltips in view (track)
    POINT cursor;
    GetCursorPos(&cursor);
    ::GetActiveView()->ScreenToClient(&cursor);
    CString labelText, descriptionText;
    ::GetActiveView()->GetToolTipLabelText(cursor, labelText, descriptionText);

    CSize sizeText(0, 0);

    BOOL bDrawDescr = m_Params.m_bDrawDescription && !m_strDescription.IsEmpty();

    CFont* pOldFont = (CFont*) pDC->SelectObject(m_Params.m_bBoldLabel && bDrawDescr ? &afxGlobalData.fontBold : &afxGlobalData.fontTooltip);

    if (labelText.Find(_T('\n')) >= 0) // Multi-line text
    {
        UINT nFormat = DT_NOPREFIX;
        if (bCalcOnly)
        {
            nFormat |= DT_CALCRECT;
        }

        if (m_pRibbonButton != NULL)
        {
            nFormat |= DT_NOPREFIX;
        }

        int nHeight = pDC->DrawText(labelText, rect, nFormat);
        sizeText = CSize(rect.Width(), nHeight);
    }
    else
    {
        if (bCalcOnly)
        {
            sizeText = pDC->GetTextExtent(labelText);
        }
        else
        {
            UINT nFormat = DT_LEFT | DT_NOCLIP | DT_SINGLELINE;

            if (!bDrawDescr)
            {
                nFormat |= DT_VCENTER;
            }

            if (m_pRibbonButton != NULL)
            {
                nFormat |= DT_NOPREFIX;
            }

            sizeText.cy = pDC->DrawText(labelText, rect, nFormat);
            sizeText.cx = rect.Width();
        }
    }

    pDC->SelectObject(pOldFont);

    SetDescription (descriptionText);

    return sizeText;
}

参考文献

How to Use CMFCToolTipCtrl Tooltips in a View for Dynamic Context Sensitive Tips

工程下载

本站上传出错,临时用360网盘https://yunpan.cn/cYxcqHxV53Tvb (提取码:53e2)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值