(參考:http://baike.baidu.com/view/3036069.htm,,http://technet.microsoft.com/zh-cn/library/aa249914) Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 轉(zhuǎn)載請(qǐng)標(biāo)明來(lái)源 1. 基本作用 OnMouseMove響應(yīng)鼠標(biāo)移動(dòng)事件 OnMouseWheel響應(yīng)鼠標(biāo)中鍵的滾動(dòng) 2. 參數(shù)說(shuō)明 afx_msgvoidOnMouseMove(UINTnFlags, CPointpoint); nFlags說(shuō)明:指示虛擬按鍵是否按下 ,,此參數(shù)可以是任何下列值的組合 MK_CONTROL 當(dāng)CTRL鍵按下時(shí) MK_LBUTTON 當(dāng)鼠標(biāo)左鍵按下時(shí) MK_MBUTTON 當(dāng)鼠標(biāo)中鍵按下時(shí)(滾動(dòng)不屬于按下) MK_RBUTTON 當(dāng)鼠標(biāo)右鍵按下時(shí). MK_SHIFT 當(dāng)SHIFT按下時(shí),。 point說(shuō)明:鼠標(biāo)的X,Y坐標(biāo):該坐標(biāo)為鼠標(biāo)相對(duì)所在窗口左上角為基點(diǎn)的位置,,是一個(gè)相對(duì)位置而不是在屏幕像素上的絕對(duì)位置,。 afx_msg BOOL OnMouseWheel( UINT nFlags, shortzDelta, CPointpt ); nFlags同上 zDelta:大于0時(shí)為向上滾動(dòng),,小于0時(shí)為向下滾動(dòng),。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下通常向上滾動(dòng)縮小/窗口上移,,反之放大/下移 pt::鼠標(biāo)的X,Y坐標(biāo),是以其父窗口的左上角為基點(diǎn)的,。Specifies the x- and y-coordinate of the cursor. These coordinates are always relative to the upper-left corner of the window. 3. 移動(dòng)的效果實(shí)現(xiàn) 要實(shí)現(xiàn)移動(dòng),,例如鼠標(biāo)左鍵拖動(dòng)butoon/圖片在窗口上移動(dòng),實(shí)現(xiàn)的結(jié)果附加要求:鼠標(biāo)放在button/圖片的A點(diǎn),,移動(dòng)之后,,鼠標(biāo)點(diǎn)依然在A點(diǎn)上 我們通過(guò) a. 檢測(cè)鼠標(biāo)已在button/圖片上(確保不是在哪都可以移動(dòng)圖標(biāo)),并且左鍵按下 b. 記錄鼠標(biāo)當(dāng)前點(diǎn)和上個(gè)點(diǎn),,計(jì)算兩個(gè)的偏移值,,然后使用這個(gè)偏移值來(lái)移動(dòng)button/圖片(MoveWindows) (記錄上個(gè)點(diǎn)的方法可以使用靜態(tài)變量,移動(dòng)完畢后,,把當(dāng)前點(diǎn)賦值給靜態(tài)變量)(具體實(shí)現(xiàn)可以靈活處理) 實(shí)現(xiàn)原理是:相對(duì)靜止---鼠標(biāo)和對(duì)象相對(duì)位置不變,,鼠標(biāo)的偏移量,就是我們對(duì)象的偏移量 4. 縮放的效果實(shí)現(xiàn)(以鼠標(biāo)點(diǎn)為中心縮放) 要實(shí)現(xiàn)縮放,,例如中件滑輪向上滑動(dòng)縮小,,向下滑動(dòng)放大button/圖片,實(shí)現(xiàn)附加要求:鼠標(biāo)放在button/圖片的A點(diǎn),,縮放之后,,鼠標(biāo)點(diǎn)依然在A點(diǎn)上,縮放是以鼠標(biāo)點(diǎn)為中心 a. 同樣檢測(cè)鼠標(biāo)已在button/圖片上(確保不是在哪都可以縮放button/圖片) b. 獲取當(dāng)前button/圖片的高和寬(使用getClientRect) c. 獲取當(dāng)前pt點(diǎn)x,y相對(duì)于button/圖片位置,,然后計(jì)算該位置相對(duì)于寬和高的比值 d. 判斷zDelta正負(fù)確定放大縮?。ò幢壤{(diào)整圖片高度和寬度),并調(diào)整圖片左上點(diǎn)(left,top)的位置,,確保c中的比值不變(---確保了以鼠標(biāo)所在點(diǎn)為中心放大或縮?。?/div> 實(shí)現(xiàn)原理是:相對(duì)移動(dòng)---鼠標(biāo)和所在對(duì)象點(diǎn)位置不變,鼠標(biāo)所在對(duì)象點(diǎn)的周圍 長(zhǎng)和寬 成比例的縮放 5. 進(jìn)階-算法 對(duì)于移動(dòng)與縮放來(lái)說(shuō),,如果看過(guò)計(jì)算機(jī)圖形學(xué),,或是接觸過(guò)matrix變換距陣操作的同學(xué),可以基于這一點(diǎn)來(lái)理解這一塊的操作,。 已知 translate 是平移的操作 scale是縮放操作 平移操作: translate(vector) vector-偏移量 假設(shè)坐標(biāo)原值為 [X.src Y.src] 對(duì)于二維平面來(lái)說(shuō),,在平移時(shí),平移量 [X.move, Y.move], 平移后的坐標(biāo)新值為 [X.src + X.move, Y.src + Y.move] 縮放操作: scale(vector, point) vector-縮放量 point-縮放的基點(diǎn) 假設(shè)坐標(biāo)原值為 [X.src Y.src] 對(duì)于二維平面來(lái)說(shuō),,縮放量,,因?yàn)槲覀儺?dāng)前縮放比例x/y軸使用相同量,所以X.scale = Y.scale,,統(tǒng)一使用scale [scale, scale] a. 對(duì)于以原心(0,0)為基礎(chǔ)的縮放的話,,縮放結(jié)果為 [X.src * scale Y.src * scale] b. 考慮到以指定點(diǎn)為縮放基點(diǎn),,設(shè)指定基點(diǎn)為 [X.base, Y.base] 則縮放齊次方程為 [scale, 0, X.base(1-scale) 0, scale, Y.base(1-scale) 0, 0, 1] 計(jì)算結(jié)果(X.src, Y.src)坐標(biāo)新值為: [X.src * scale + X.base*(1-scale), Y.src * scale + Y.base*(1-scale)] 對(duì)于中心點(diǎn)的位置,會(huì)隨著縮放靠近或遠(yuǎn)離基點(diǎn),,可以根據(jù)偏移量定位 X.newcenter = X.base - (X.base - X.oldcenter) * scale Y.newcenter = Y.base - (Y.base - Y.oldcenter) * scale 旋轉(zhuǎn)操作:rotate(angle, point) angle-旋轉(zhuǎn)角度 point-旋轉(zhuǎn)基點(diǎn) 假設(shè)坐標(biāo)原值為 [X.src Y.src] 對(duì)于二維平面來(lái)說(shuō),,設(shè)旋轉(zhuǎn)角度為@度,逆時(shí)針旋轉(zhuǎn),, a. 如果繞著圓心(0,0)旋轉(zhuǎn)的話,, X.dest = R * Cos(OrgAngle + @) = R * sin(OrgAngle) * sin(@) + R * cos(OrgAngle) * cos (@) = X.src * Sin@ + Y.src * cos@ Y.dest = R * Sin(OrgAngle + @) = X.src * -Sin(@) + Y.src * cos(@) 相當(dāng)于乘以矩陣 [ sin@, cos@ -sin@, cos@] b. 考慮到繞特定點(diǎn)旋轉(zhuǎn),設(shè)指定基點(diǎn)為 [X.org, Y.org] 則相當(dāng)于,,偏移特定點(diǎn)為(0,0)點(diǎn),,旋轉(zhuǎn)后再偏移回來(lái) X.dest = X.org + (X.src - X.org) * sin@ + (Y.src-Y.org)*cos@ Y.dest = Y.org - (X.src - X.org) * sin@ + (Y.src-Y.org)*cos@ 齊次方程為 [ sin@, cos@, X.org - X.org * sin@ - Y.org * cos@ -sin@, cos@, Y.org + X.org * sin@ - Y.org * cos@ 0, 0, 1] 綜述:從圖形學(xué)的這些計(jì)算上來(lái)看,我們實(shí)現(xiàn)的平移,,鼠標(biāo)點(diǎn)為中心放大 也或 旋轉(zhuǎn) 的算法部分都屬于比較基礎(chǔ)的應(yīng)用,。還算比較簡(jiǎn)單,畢竟是二維的,。 如果希望深入掌握這些的話,,可以閱讀下《計(jì)算機(jī)圖形學(xué)》這本書(shū)。 --------------------- 作者:春夜喜雨 來(lái)源:CSDN
|
|