【MFC消息】無標題Dialog的拖動

原文地址: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)。

發佈了12 篇原創文章 · 獲贊 13 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章