將對話框屬性設置為 Style: Popup、Border: None 後,對話框失去標題欄和邊框,導致無法通過鼠標拖動移動。
WM_NCHITTEST 返回 HTCAPTION,允許拖動Border: None 移除了非客戶區,Style: Popup 移除了標題欄HTCLIENT,不觸發移動邏輯WM_NCHITTESTOnNcHitTestLRESULT CMyDialog::OnNcHitTest(CPoint point) {
// 將屏幕坐標轉為客戶區坐標
ScreenToClient(&point);
// 獲取客戶區矩形
CRect rect;
GetClientRect(&rect);
// 定義可拖動區域(如頂部 30 像素)
CRect dragRect(0, 0, rect.Width(), 30);
// 點擊在可拖動區域內,返回 HTCAPTION
if (dragRect.PtInRect(point)) {
return HTCAPTION;
}
return CDialog::OnNcHitTest(point);
}
LRESULT CMyDialog::OnNcHitTest(CPoint point) {
ScreenToClient(&point);
// 遍歷所有子控件,排除控件佔用區域
CWnd* pChild = GetWindow(GW_CHILD);
while (pChild) {
CRect childRect;
pChild->GetWindowRect(&childRect);
ScreenToClient(&childRect);
if (childRect.PtInRect(point)) {
return HTCLIENT; // 在控件上,不拖動
}
pChild = pChild->GetNextWindow(GW_HWNDNEXT);
}
return HTCAPTION; // 其他空白區域可拖動
}
Border: Thin,系統自動處理邊緣拖動WS_EX_DLGMODALFRAME 樣式配合自定義標題欄DoModal() 調用時需注意父窗口狀態