void CXXXXDialog::OnLButtonDown(UINT nFlags, CPoint point) { PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y)); } 要記得添加消息映射,不然這個代 ...
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 }