MFC无标题栏对话框移动的处理方法
? ? 很多時候,為了界面的美觀,我們會隱藏標題欄,而在客戶區(qū)通過自繪模擬標題欄。但是這樣處理,會導致窗體無法移動。下面提供幾種移動方法:
? ? 1、采用欺騙的方式。即當鼠標點擊客戶區(qū)的時候,我們欺騙windows,讓windows認為我們點擊在了標題欄,這樣,拖動過程就通過windows進行處理了。因此可以大大減少我們的代碼量。具體方法如下:
響應鼠標左鍵按下消息WM_LBUTTONDOWN,相應函數(shù)中,直接發(fā)送欺騙消息:
PostMessage(WM_NCLBUTTONDOWN,?HTCAPTION,?MAKELPARAM(point.x,?point.y));? ? WM_NCLBUTTONDOWN即左鍵在非客戶區(qū)按下,HTCAPTION即標題欄,所以采用這種方式,就可以實現(xiàn)無標題欄對話框的移動問題了。
? ? 那么問題來了。。。
? ? 采用這種操作后,會導致我們的對話框無法響應WM_LBUTTONUP消息,同時在我編寫程序過程中發(fā)現(xiàn)WM_NCLBUTTONUP也一般不能響應。當然,可以通過注冊WM_MOUSEHOVER以及WM_MOUSELEAVE消息,響應這兩個消息去處理相應的代碼,或者采用下鉤子的方法,在鉤子中正確發(fā)送消息,不過不推薦這種方法,實現(xiàn)也比較麻煩。
? ? 所以下面提供第二種方法。
? ? 2、在WM_MOUSEMOVE消息中,自己處理窗口移動。具體就是先判斷鼠標左鍵是否處于按下,如果是的話,就獲取鼠標移動到的位置,然后將窗口進行移動就可以了。具體實現(xiàn)如下:
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);? }? ? 通過上面的消息,就能夠進行窗口移動了。然而,如果僅僅響應上面的消息發(fā)現(xiàn)兩個問題:第一,當鼠標按住左鍵快速移動的時候,鼠標會移出窗口,窗口不動了,拖動效果不好;第二,左鍵釋放消息在上面這種情況下沒有響應。解決方法如下:
? ? 首先左鍵按下消息中設置鼠標捕獲
SetCapture();? ? 在左鍵釋放消息中釋放鼠標捕獲
RealeseCapture();? ? 通過上面的處理,就可以完美拖動,同時,左鍵抬起的消息也不會受影響。
? ? 因此,第一種方法較為簡潔,適合不需要響應鼠標其它消息的情況;第二種方法相對麻煩一些,不過實現(xiàn)效果也很好,并且不影響其他消息。
轉載于:https://blog.51cto.com/jincheng/1618302
總結
以上是生活随笔為你收集整理的MFC无标题栏对话框移动的处理方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux虚拟机下使用USB转串口线——
- 下一篇: Eclipse安装Rust插件 (Ubu