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
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM