在 MFC 對話框應用程式中實現無標題列視窗的滑鼠拖曳移動,無需手動計算矩形區域或處理滑鼠訊息細節,核心在於攔截 WM_NCHITTEST 非用戶區測試訊息。
ClassWizard 無法直接新增 WM_NCHITTEST,需在 BEGIN_MESSAGE_MAP 宏中手寫:
ON_WM_NCHITTEST()
標頭檔宣告:
afx_msg UINT OnNcHitTest(CPoint point);
void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
CDialog::OnLButtonDown(nFlags, point); // 基類改為實際父類
PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
}
UINT CMyDlg::OnNcHitTest(CPoint point)
{
UINT nHitTest = CDialog::OnNcHitTest(point); // 基類同前
return (nHitTest == HTCLIENT) ? HTCAPTION : nHitTest;
}
WM_NCHITTEST 回傳值告知系統滑鼠位於視窗哪個區域(HTCLIENT 用戶區、HTCAPTION 標題列等);HTCLIENT)強制映射為標題列(HTCAPTION),系統即視為使用者按在標題列上,自動處理移動邏輯;OnLButtonDown 中 PostMessage(WM_NCLBUTTONDOWN, HTCAPTION...) 確保按下瞬間即進入拖曳狀態。基於對話框應用程式,VC6.0 + Windows NT 4.0 編譯測試通過,前後不超過 10 行核心程式碼。