通過在客戶區拖動滑鼠來移動視窗引發的一些問題

2021-06-20 09:04:35 字數 1029 閱讀 1145

最近在研究羅雲彬的win32彙編(個人覺得是本好書),gdi一章,bmp時鐘,發現這樣乙個問題:摘錄原文如下:

void cls_onlbuttondown(hwnd hwnd, bool fdoubleclick, int x, int y, uint keyflags)//左鍵按下訊息響應函式

在指定 cs_dblclks 風格的情況下,經過這樣的處理後,單擊並放開滑鼠左鍵,程式沒收到wm_lbuttonup訊息。而雙擊滑鼠後,程式卻收到了wm_lbuttonup訊息。

在網上查到以下資料:

因為預設的wndproc裡面做了處理。(裡面有個while 迴圈,使用setcapture/getmessage 來捕捉滑鼠訊息,實現視窗標題欄的拖動)。只有滑鼠釋放才退出這個迴圈。

同樣的 wm_nclbuttonup 訊息也由於 while迴圈的存在,無法被正常攔截。

自己又做了實驗,發現雙擊視窗時(指定 cs_dblclks 風格),按順序收到訊息如下:

(1)wm_lbuttondown(2)wm_lbuttonup(3)wm_lbuttondblclk(4)wm_lbuttonup

所以我認為異常出現的原因是這樣的:

單擊滑鼠並放開,收到  wm_lbuttondown訊息,呼叫postmessage(...,wm_nclbuttondown,...,...)後,wm_lbuttonup無法被響應

雙擊滑鼠再放開,收到  wm_lbuttondown訊息,呼叫postmessage(...,wm_nclbuttondown,...,...)後,(2)wm_lbuttonup無法被響應,緊接著收到(3)wm_lbuttondblclk  訊息,由於  wm_lbuttondblclk  的響應函式中沒有  postmessage(...,wm_nclbuttondown,...,...)  相關**,所以(4)wm_lbuttonup被響應,於是便形成了以上的現象。

不過這純屬我個人的猜想,還有待進一步的證明!!

Qt 支援滑鼠拖動來移動內容的視窗

最近有個qt的專案碰到問題,問題是這樣的 要使qt的視窗內容支援drag移動,即按住滑鼠左鍵在視窗裡移動時,視窗的滾動條和內容隨著滑鼠的移動而移動。實現的方法實現乙個類,此類派生自qscrollarea,安裝事件過濾器,對滑鼠的事件進行處理來實現內容的移動。如下 標頭檔案 include class...

Qt 通過滑鼠移動視窗

用 qt 開發桌面端程式的時候,通常會去掉自帶的標題欄,然後自定義乙個標題欄,那麼就需要實現通過滑鼠來移動窗體。實現邏輯其實很簡單,只需要捕捉到滑鼠的座標點,在 mousemove 事件中實現窗體移動。void actionwidget mousepressevent qmouseevent eve...

Qt 通過滑鼠拖拽,來移動無邊框窗體

設定視窗標誌為無邊框 setwindowflags qt framelesswindowhint windowflags 關於windowflags列舉值很多,其中有乙個windowstaysontophint,可以讓窗體位於所有介面之上,類似於qq主面板,一開啟就在所有軟體之上 比較霸道。設定無邊...