You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否配置CMFCColorDialog,使鼠标悬停时Tooltip显示选中颜色名称?

实现CMFCColorDialog悬停显示颜色名称Tooltip

CMFCColorDialog本身没有内置鼠标悬停显示颜色名称的Tooltip功能,但可以通过子类化该对话框并结合CToolTipCtrl自定义实现,以下是具体步骤和代码示例:

1. 子类化CMFCColorDialog

创建继承自CMFCColorDialog的子类,添加Tooltip控件成员变量和消息处理函数:

头文件(MyColorDialog.h)

#pragma once
#include <afxcolordialog.h>

class CMyColorDialog : public CMFCColorDialog
{
    DECLARE_DYNAMIC(CMyColorDialog)
public:
    CMyColorDialog(COLORREF clrInit = 0, DWORD dwFlags = 0, CWnd* pParentWnd = nullptr);
    virtual ~CMyColorDialog();

protected:
    DECLARE_MESSAGE_MAP()
    virtual BOOL OnInitDialog();
    afx_msg void OnMouseMove(UINT nFlags, CPoint point);
    afx_msg BOOL OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult);

private:
    CToolTipCtrl m_toolTip;
    COLORREF m_currentHoverColor;
    CString GetColorName(COLORREF clr);
    COLORREF GetColorFromHoverPoint(CPoint point);
};

实现文件(MyColorDialog.cpp)

#include "MyColorDialog.h"
#include <afxcmn.h>

IMPLEMENT_DYNAMIC(CMyColorDialog, CMFCColorDialog)

CMyColorDialog::CMyColorDialog(COLORREF clrInit, DWORD dwFlags, CWnd* pParentWnd)
    : CMFCColorDialog(clrInit, dwFlags, pParentWnd)
    , m_currentHoverColor(CLR_INVALID)
{}

CMyColorDialog::~CMyColorDialog()
{}

BEGIN_MESSAGE_MAP(CMyColorDialog, CMFCColorDialog)
    ON_WM_MOUSEMOVE()
    ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &CMyColorDialog::OnToolTipNotify)
END_MESSAGE_MAP()

BOOL CMyColorDialog::OnInitDialog()
{
    CMFCColorDialog::OnInitDialog();

    // 初始化Tooltip控件
    m_toolTip.Create(this);
    m_toolTip.AddTool(this, _T(""));
    m_toolTip.SetDelayTime(TTDT_INITIAL, 100); // 悬停100ms后显示Tooltip
    EnableToolTips(TRUE);

    return TRUE;
}

void CMyColorDialog::OnMouseMove(UINT nFlags, CPoint point)
{
    CMFCColorDialog::OnMouseMove(nFlags, point);

    COLORREF hoverColor = GetColorFromHoverPoint(point);
    if (hoverColor != m_currentHoverColor)
    {
        m_currentHoverColor = hoverColor;
        if (hoverColor != CLR_INVALID)
        {
            m_toolTip.UpdateTipText(GetColorName(hoverColor), this);
            m_toolTip.Popup();
        }
        else
        {
            m_toolTip.Hide();
        }
    }
}

BOOL CMyColorDialog::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult)
{
    TOOLTIPTEXT* pTTT = reinterpret_cast<TOOLTIPTEXT*>(pNMHDR);
    if (m_currentHoverColor != CLR_INVALID)
    {
        pTTT->lpszText = GetColorName(m_currentHoverColor).GetBuffer();
    }
    else
    {
        pTTT->lpszText = _T("");
    }
    *pResult = 0;
    return TRUE;
}

COLORREF CMyColorDialog::GetColorFromHoverPoint(CPoint point)
{
    // 获取颜色网格控件(CMFCColorDialog内部的颜色选择区域)
    CMFCColorGridCtrl* pColorGrid = dynamic_cast<CMFCColorGridCtrl*>(GetDlgItem(IDC_COLOR_GRID));
    if (!pColorGrid) return CLR_INVALID;

    CRect gridRect;
    pColorGrid->GetWindowRect(gridRect);
    ScreenToClient(gridRect);
    if (!gridRect.PtInRect(point)) return CLR_INVALID;

    // 计算鼠标在网格内的相对位置,获取对应颜色
    CPoint gridPoint(point.x - gridRect.left, point.y - gridRect.top);
    int row, col;
    if (pColorGrid->HitTest(gridPoint, row, col))
    {
        return pColorGrid->GetColor(row, col);
    }
    return CLR_INVALID;
}

CString CMyColorDialog::GetColorName(COLORREF clr)
{
    // 基础颜色名称映射,可根据需求扩展
    if (clr == RGB(255, 0, 0)) return _T("红色");
    if (clr == RGB(0, 255, 0)) return _T("绿色");
    if (clr == RGB(0, 0, 255)) return _T("蓝色");
    if (clr == RGB(255, 255, 0)) return _T("黄色");
    if (clr == RGB(255, 165, 0)) return _T("橙色");
    if (clr == RGB(128, 0, 128)) return _T("紫色");
    if (clr == RGB(0, 0, 0)) return _T("黑色");
    if (clr == RGB(255, 255, 255)) return _T("白色");

    // 自定义颜色显示RGB值
    return CString().Format(_T("RGB(%d,%d,%d)"), GetRValue(clr), GetGValue(clr), GetBValue(clr));
}

2. 使用自定义颜色对话框

在需要调用颜色选择对话框的代码中,用CMyColorDialog替代原CMFCColorDialog:

CMyColorDialog dlg(RGB(255,0,0));
if (dlg.DoModal() == IDOK)
{
    COLORREF selectedColor = dlg.GetColor();
    // 处理选中的颜色
}

说明

  • 代码中通过CMFCColorGridCtrl获取颜色网格控件,若控件IDIDC_COLOR_GRID与MFC内部定义不一致,可通过Spy++工具查看实际ID。
  • GetColorName函数可根据需求扩展更多颜色的名称映射,覆盖常用色值。
  • Tooltip的显示延迟可通过SetDelayTime调整,适配不同操作习惯。

内容的提问来源于stack exchange,提问作者Andrew Truckle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:35:18