原文地址:http://hi.baidu.com/jgkang/blog/item/ac017c0a07b287db62d986aa.html
1.添加WM_NCHITTEST消
息
在類視圖裏右鍵點擊需要添加消息響應的類選擇彈出菜單中的“Add Windows Message Handler...”
選項然後在彈出的窗口右下角設置“Filter for messages available to ”
爲“Window”才能看到WM_NCHITTEST,
2.編寫消息響應函數如下:
UINT *對話框類*::OnNcHitTest(CPoint pt)
{
CRect rc;
GetClientRect(&rc);
ClientToScreen(&rc);
return rc.PtInRect(pt) ? HTCAPTION : CDialog::OnNcHitTest(pt);
//當鼠標落在客戶區內,函數返回HTCAPTION
}
說明:
Windows本身知道通過鼠標點住標題欄可以移動窗口,將鼠標在窗口客戶區任何地方
的點擊拖動行爲都模仿成好像是在標題欄中一樣
就產生了這種拖動窗口移動的方法。實際上,用鼠標點住對話框背景進行拖動操
作並不難,但是你必須瞭解在標題欄裏拖動窗口的原理。Windows首先確定鼠標點中了哪個窗口,然後向那個窗口發送一個WM_NCHITTEST消息找
出此窗口的哪個"非客戶區"(如邊界、最大化/最小化按鈕、菜單、標題等等)擁有鼠標光標。接着默認的窗口過程響應消息並返回一個特定的代碼。如果鼠標指
針落在標題欄中,那麼這個特定代碼就是HTCAPTION,此時Windows便進入拖拽模式,以便用戶能夠對窗口進行移動操作。所以要想在客戶區裏用鼠
標拖動對話框,那麼只要在客戶區裏模仿標題欄裏的鼠標拖動行爲
即可。
如果用戶單擊某個控制,只要這個控制不是靜態位圖圖像或者文本,那麼Windows都將鼠標事件發送到該控制上,而不是對話框。由於靜態位圖圖像或者文本
對於對話框是透明的,所以鼠標在上面的拖動同樣實現移動,而對於對話框中的編輯框、按鈕、組合框等其它非靜態控制則按通常的行爲方式運行。
繁瑣方法
解決無標題欄窗口的拖動問題有兩種方案,一種方案是使用常規思路來處理鼠標拖拽事件,當窗口獲得
WM_LBUTTONDOWN(OnLButtonDown)時,通過設置標誌並調用CWnd::SetCapture()函數來讓當前窗口捕捉鼠標消
息,應用程序進入移動模式,此時只要有WM_MOUSEMOVE消息過來,就可以據此移動框架窗口,最後當用戶釋放鼠標按鈕,則WM_LBUTTONUP
消息處理例程清除標誌並調用CWnd::ReleaseCapture()函數將鼠標控制返還給Windows。這種方法比較繁瑣,首先要決定窗口準備移
到哪?然後要想好如何重繪窗口等等,而且根據屏幕顯示屬性對話框"效果"頁中"視覺效果"項的"拖動時顯示窗口中內容"複選框是不是選中,拖動效果是不同
的。那麼你怎麼知道設置的信息呢?方法是調用SystemParametersInfo(SPI_GETDRAGFULLWINDOWS)。