久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

OnMouseMove移動(dòng)位置和OnMouseWheel縮放實(shí)現(xiàn)

 江江385 2018-12-26
(參考: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 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多