MFC:拖動無標題窗口的兩種方法

有的時候,我們需要自繪窗口的標題,或者隱藏了窗口標題,那麼問題來了,這就是怎麼拖動無標題的窗口

這個問題的本質便是怎麼在窗口的客戶區上,拖動鼠標,並且移動窗口

通常狀態下,一個窗口只有在標題欄的區域,纔會響應鼠標拖動的消息。而在窗口的客戶區並不會響應。

這樣便有了一個方法,就是我們可以欺騙windows,讓它誤認爲鼠標點擊窗口客戶區時是點擊在了標題欄上。

有這麼個消息,就是WM_NCHITTEST。

MSDN對它的解釋是:

The WM_NCHITTEST message is sent to a window when the cursor moves, or when a mouse button is pressed or released. If the mouse is not captured, the message is sent to the window beneath the cursor. Otherwise, the message is sent to the window that has captured the mouse.

這個消息是當鼠標移動或者有鼠標鍵按下時候發出的。

如果WM_NCHITTEST的消息響應函數的返回值是HTCLIENT,表示鼠標點擊的是客戶區,則Windows會向窗口發送WM_LBUTTONDOWN消息;如果WM_NCHITTEST的消息響應函數的返回值不是HTCLIENT(可能是HTCAPTION、HTCLOSE、HTMAXBUTTON等),即鼠標點擊的是非客戶區,Windows就會向窗口發送WM_NCLBUTTONDOWN消息。

這個介紹對這個沒有什麼大關係,但是可以幫助你理解。

接下來便是實現的具體方法,這個方法分爲兩步:

1.在MESSAGE_MAP中添加ON_WM_NCHITTEST()

2.手動添加響應函數UINT OnNcHitTest(CPoint point)

其中應這麼處理:

UINT CYourClass::OnNcHitTest(CPoint point)
{
 UINT nh=CDialog::OnNcHitTest(point);
 return ((nh==HTCLIENT)?HTCAPTION:nh);
}

第二個辦法很簡單了,就是處理鼠標左擊消息

首先添加鼠標左鍵單擊消息,用自動添加便可。

void CYourClass::OnLButtonDown(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default
 SendMessage(WM_SYSCOMMAND,0xF012,0);
 CDialog::OnLButtonDown(nFlags, point);
}

需要注意的是SendMessage(WM_SYSCOMMAND,0xF012,0);

這跟第一個方法的效果相差不大,發送的消息說明的是發送SC_MOVE + HTCAPTION,所以這裏簡寫成爲0xF012。

第二個方法要比第一種更加簡單,容易使用。

 

轉載自:http://www.limou.net/?p=583

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