void CXXXXDialog::OnLButtonDown(UINT nFlags, CPoint point) { PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y)); }
要記得添加消息映射,不然這個代碼是不起作用的。
轉:
移動標准窗口是通過用鼠標單擊窗口標題條來實現的,但對於沒有標題條的窗口,就需要用鼠標單擊窗口標題條以外區域來移動窗口。有兩種方法可以達到這一目標。
方法一:當窗口確定鼠標位置時,Windows向窗口發送WM_NCHITTEST消息,可以處理該消息,使得只要鼠標在窗口內,Windows便認為鼠標在標題條上。這需要重載CWnd類處理WM_NCHITTEST消息的OnNcHitTest函數,在函數中調用父類的該函數,如果返回HTCLIENT,說明鼠標在窗口客戶區內,使重載函數返回HTCAPTION,使Windows誤認為鼠標處於標題條上。
下例是使用該方法的實際代碼:
UINT CEllipseWndDlg::OnNcHitTest(CPoint point) { // 取得鼠標所在的窗口區域 UINT nHitTest = CDialog::OnNcHitTest(point); // 如果鼠標在窗口客戶區,則返回標題條代號給Windows // 使Windows按鼠標在標題條上類進行處理,即可單擊移動窗口 return (nHitTest==HTCLIENT) ? HTCAPTION : nHitTest; }
方法二:當用戶在窗口客戶區按下鼠標左鍵時,使Windows認為鼠標是在標題條上,即在處理WM_LBUTTONDOWN消息的處理函數OnLButtonDown中發送一個wParam參數為HTCAPTION,lParam為當前坐標的WM_NCLBUTTONDOWN消息。
下面是使用該方法的實際代碼:
void CEllipseWndDlg::OnLButtonDown(UINT nFlags, CPoint point) { // 調用父類處理函數完成基本操作 CDialog::OnLButtonDown(nFlags, point); // 發送WM_NCLBUTTONDOWN消息 // 使Windows認為鼠標在標題條上 PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y)); //或SendMessage(WM_SYSCOMMAND,0xF012,0); //0xF012 = SC_MOVE | HTCAPTION }