原 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()),提升視覺一致性。

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