首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

MFC 視圖類整合工具提示:滑鼠移動動態顯示座標資訊

     編輯:VC 教學

需求背景

工具列按鈕預設有 ToolTip,但視圖類 (CView) 客戶區無內建支援。影像處理、圖表應用常需在滑鼠移動時即時顯示像素座標、數值等資訊。

實作步驟

1. 成員變數宣告


class CTestView : public CView
{
    CToolTipCtrl m_ToolTip;
    CString      m_strTip;
    CRect        m_rcClient;
    enum { IDC_TIP = 12345 }; // 自訂工具 ID,避免衝突
};

2. OnMouseMove 動態更新提示內容與區域


void CTestView::OnMouseMove(UINT nFlags, CPoint point)
{
    m_strTip.Format(_T("%d, %d"), point.x, point.y);
    GetClientRect(&m_rcClient);

    // 移除舊工具並重新加入 (或使用 UpdateTipText)
    m_ToolTip.DelTool(this, IDC_TIP);
    m_ToolTip.AddTool(this, m_strTip, &m_rcClient, IDC_TIP);
    m_ToolTip.Activate(TRUE);

    CView::OnMouseMove(nFlags, point);
}

3. WindowProc 轉發滑鼠訊息給 ToolTip 控件


LRESULT CTestView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_MBUTTONDOWN:
    case WM_LBUTTONUP:   case WM_RBUTTONUP:   case WM_MBUTTONUP:
    case WM_MOUSEMOVE:
        {
            MSG msg;
            msg.hwnd = m_hWnd;
            msg.message = message;
            msg.wParam = wParam;
            msg.lParam = lParam;
            m_ToolTip.RelayEvent(&msg); // 關鍵:讓 ToolTip 內部追蹤滑鼠位置
        }
        break;
    }
    return CView::WindowProc(message, wParam, lParam);
}

進階優化

  • 避免頻繁 DelTool/AddTool:改用 m_ToolTip.UpdateTipText(m_strTip, this, IDC_TIP) 僅更新文字。
  • 多區域工具提示:針對不同矩形區域呼叫多次 AddTool,每組指定不同 nIDTool。
  • 延遲顯示:m_ToolTip.SetDelayTime(TTDT_INITIAL, 500) 設定 500ms 才顯示。
  • 自訂外觀:處理 TTN_NEEDTEXT 通知,動態回傳富文本或圖示。

完整初始化範例 (OnInitialUpdate)


void CTestView::OnInitialUpdate()
{
    CView::OnInitialUpdate();
    m_ToolTip.Create(this, TTS_ALWAYSTIP | TTS_NOPREFIX);
    m_ToolTip.Activate(TRUE);
    m_ToolTip.SetDelayTime(TTDT_AUTOPOP, 5000);
    m_ToolTip.SetDelayTime(TTDT_RESHOW, 200);
}

適用範圍

同樣技巧適用於 CScrollView、CFormView、CDialog 等任何 CWnd 衍生類,只需確保訊息迴圈能將滑鼠訊息傳遞給 RelayEvent。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved