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

完善 CPopupText 類:解決列表框長文本提示層阻擋點擊與字體一致性問題

     編輯:關於VC++

問題現象

原 CPopupText 類在列表框項目過長時彈出提示條,但用戶點擊提示條下方的列表項無法選中,且提示條字體與列表框不一致。

根因分析

提示條窗口攔截了鼠標消息,導致底層列表框收不到 WM_LBUTTONDOWN。

核心修復:HTTRANSPARENT 穿透點擊


UINT CPopupText::OnNcHitTest(CPoint pt)
{
    return HTTRANSPARENT; // 告訴 Windows:我是透明的,鼠標事件傳給下層窗口
}

僅一行代碼,即可讓點擊事件穿透提示條直接落到列表框,實現選中。

進一步優化:點擊即隱藏提示

在 CListBoxTipHandler::WindowProc 攔截 WM_LBUTTONDOWN,主動調用 g_wndTip.Cancel() 清除提示,給用戶即時視覺反饋。


LRESULT CListBoxTipHandler::WindowProc(UINT msg, WPARAM wp, LPARAM lp)
{
    if (msg == WM_LBUTTONDOWN) {
        g_wndTip.Cancel(); // 清除提示文本
    }
    return CSubclassWnd::WindowProc(msg, wp, lp);
}

字體一致性改進

原類使用系統狀態字體 (NONCLIENTMETRICS::lfStatusFont),改為使用列表框字體(GetFont()),提升視覺一致性。

效果對比

選中項目後提示消失

修復後:點擊提示條 → 列表項被選中 → 提示條自動消失 → 字體與列表框一致,體驗完美。

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