MFC中無邊框窗口的拖動

 
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
}
相關文章
相關標籤/搜索