日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MFC无标题栏对话框移动的处理方法

發布時間:2025/3/17 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC无标题栏对话框移动的处理方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? 很多時候,為了界面的美觀,我們會隱藏標題欄,而在客戶區通過自繪模擬標題欄。但是這樣處理,會導致窗體無法移動。下面提供幾種移動方法:

? ? 1、采用欺騙的方式。即當鼠標點擊客戶區的時候,我們欺騙windows,讓windows認為我們點擊在了標題欄,這樣,拖動過程就通過windows進行處理了。因此可以大大減少我們的代碼量。具體方法如下:

響應鼠標左鍵按下消息WM_LBUTTONDOWN,相應函數中,直接發送欺騙消息:

PostMessage(WM_NCLBUTTONDOWN,?HTCAPTION,?MAKELPARAM(point.x,?point.y));

? ? WM_NCLBUTTONDOWN即左鍵在非客戶區按下,HTCAPTION即標題欄,所以采用這種方式,就可以實現無標題欄對話框的移動問題了。

? ? 那么問題來了。。。

? ? 采用這種操作后,會導致我們的對話框無法響應WM_LBUTTONUP消息,同時在我編寫程序過程中發現WM_NCLBUTTONUP也一般不能響應。當然,可以通過注冊WM_MOUSEHOVER以及WM_MOUSELEAVE消息,響應這兩個消息去處理相應的代碼,或者采用下鉤子的方法,在鉤子中正確發送消息,不過不推薦這種方法,實現也比較麻煩。

? ? 所以下面提供第二種方法。

? ? 2、在WM_MOUSEMOVE消息中,自己處理窗口移動。具體就是先判斷鼠標左鍵是否處于按下,如果是的話,就獲取鼠標移動到的位置,然后將窗口進行移動就可以了。具體實現如下:

void?CMyDlg::OnMouseMove(UINT?nFlags,?CPoint?point)?? {??static?CPoint?PrePoint?=?CPoint(0,?0);??if(MK_LBUTTON?==?nFlags)??{??if(point?!=?PrePoint)??{??CPoint?ptTemp?=?point?-?PrePoint;??CRect?rcWindow;??GetWindowRect(&rcWindow);??rcWindow.OffsetRect(ptTemp.x,?ptTemp.y);??MoveWindow(&rcWindow);??return?;??}??}??PrePoint?=?point;??CDialog::OnMouseMove(nFlags,?point);? }

? ? 通過上面的消息,就能夠進行窗口移動了。然而,如果僅僅響應上面的消息發現兩個問題:第一,當鼠標按住左鍵快速移動的時候,鼠標會移出窗口,窗口不動了,拖動效果不好;第二,左鍵釋放消息在上面這種情況下沒有響應。解決方法如下:

? ? 首先左鍵按下消息中設置鼠標捕獲

SetCapture();

? ? 在左鍵釋放消息中釋放鼠標捕獲

RealeseCapture();

? ? 通過上面的處理,就可以完美拖動,同時,左鍵抬起的消息也不會受影響。


? ? 因此,第一種方法較為簡潔,適合不需要響應鼠標其它消息的情況;第二種方法相對麻煩一些,不過實現效果也很好,并且不影響其他消息。

轉載于:https://blog.51cto.com/jincheng/1618302

總結

以上是生活随笔為你收集整理的MFC无标题栏对话框移动的处理方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。