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

無標題列視窗拖曳移動技巧:WM_NCHITTEST 訊息實作

     編輯:VC 教學

在 MFC 對話框應用程式中實現無標題列視窗的滑鼠拖曳移動,無需手動計算矩形區域或處理滑鼠訊息細節,核心在於攔截 WM_NCHITTEST 非用戶區測試訊息。

實作步驟(以 VC6.0 / MFC 為例)

1. 手動加入訊息對應

ClassWizard 無法直接新增 WM_NCHITTEST,需在 BEGIN_MESSAGE_MAP 宏中手寫:

ON_WM_NCHITTEST()

標頭檔宣告:

afx_msg UINT OnNcHitTest(CPoint point);

2. 處理左鍵按下 — 轉發非用戶區左鍵訊息

void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
    CDialog::OnLButtonDown(nFlags, point);  // 基類改為實際父類
    PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
}

3. 覆寫 OnNcHitTest — 將用戶區判定為標題列

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 行核心程式碼。

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