1. 程式人生 > >MFC滑鼠事件-OnMouseMove移動OnMouseWheel縮放

MFC滑鼠事件-OnMouseMove移動OnMouseWheel縮放

(1)目的說明:重新實現MFC中的滑鼠事件函式,實現滑鼠左鍵拖動效果和滾輪拖動效果。

(2)滑鼠事件說明:

OnMouseMove響應滑鼠移動事件
OnMouseWheel響應滑鼠中鍵的滾動

(3)滑鼠事件引數說明

afx_msgvoidOnMouseMove(UINTnFlags, CPointpoint);
nFlags說明:指示虛擬按鍵是否按下 ,此引數可以是任何下列值的組合
MK_CONTROL 當CTRL鍵按下時
MK_LBUTTON 當滑鼠左鍵按下時
MK_MBUTTON 當滑鼠中鍵按下時(滾動不屬於按下)
MK_RBUTTON 當滑鼠右鍵按下時.
MK_SHIFT 當SHIFT按下時。
point說明:滑鼠的X,Y座標:該座標為滑鼠相對所在視窗左上角為基點的位置,是一個相對位置而不是在螢幕畫素上的絕對位置。
 
afx_msg BOOL OnMouseWheel( UINT nFlags, shortzDelta, CPointpt );
nFlags同上
zDelta:大於0時為向上滾動,小於0時為向下滾動。A value less than zero indicates rotating back (toward the user) while a value greater than zero indicates rotating forward (away from the user). Windows下通常向上滾動縮小/視窗上移,反之放大/下移
pt::滑鼠的X,Y座標,是以其父視窗的左上角為基點的。Specifies the x- and y-coordinate of the cursor. These coordinates are always relative to the upper-left corner of the window.

(4)滑鼠拖動和縮放功能實現

1. 移動的效果實現
要實現移動,例如滑鼠左鍵拖動butoon/圖片在視窗上移動,實現的結果附加要求:滑鼠放在button/圖片的A點,移動之後,滑鼠點依然在A點上
我們通過
a. 檢測滑鼠已在button/圖片上(確保不是在哪都可以移動圖示),並且左鍵按下
b. 記錄滑鼠當前點和上個點,計算兩個的偏移值,然後使用這個偏移值來移動button/圖片(MoveWindows)
(記錄上個點的方法可以使用靜態變數,移動完畢後,把當前點賦值給靜態變數)(具體實現可以靈活處理)
實現原理是:相對靜止---滑鼠和物件相對位置不變,滑鼠的偏移量,就是我們物件的偏移量
 
2. 縮放的效果實現(以滑鼠點為中心縮放)
要實現縮放,例如中件滑輪向上滑動縮小,向下滑動放大button/圖片,實現附加要求:滑鼠放在button/圖片的A點,縮放之後,滑鼠點依然在A點上,縮放是以滑鼠點為中心
a. 同樣檢測滑鼠已在button/圖片上(確保不是在哪都可以縮放button/圖片)
b. 獲取當前button/圖片的高和寬(使用getClientRect)
c. 獲取當前pt點x,y相對於button/圖片位置,然後計算該位置相對於寬和高的比值
d. 判斷zDelta正負確定放大縮小(按比例調整圖片高度和寬度),並調整圖片左上點(left,top)的位置,確保c中的比值不變(---確保了以滑鼠所在點為中心放大或縮小)
實現原理是:相對移動---滑鼠和所在物件點位置不變,滑鼠所在物件點的周圍 長和寬 成比例的縮放