2008年9月6日 星期六

[C/C++]滑鼠手勢...

今天一進公司就看到Steven和Jacky在討論東西...
在我才剛按下開機鍵準備坐上我的座位時
就聽見Steven說...”這就交給kie做吧! 反正他這麼閒“ .....(= =ll)雖然真的很閒也不用這麼大聲的講出來吧!

好啦...切入重點...他們在討論的就是一個簡單的滑鼠手勢的程式的演算法
其實真的是非常的簡單...Coding的部份也不過幾行而已...
重點是他們都把演算法都討論的差不多了...於是希望我實做出來..
好吧...於是就有了這一篇文章啦.....
這個程式呢...基本上應該算是一個Funtion
所以呢...我就不把全部的程式貼出來了
做法是
先按下左鍵取得起點...接著比對每一點座標
當位移量超過誤差的範圍就記錄為一個動作
並記下完成的點的位置
當比對和上次的動作相同時就不記錄
當放開左鍵時動作結束

以下為重點的Source Code

首先我在主程式加入了4個全域變數

Direction ..存上一次得到的方向
X.........記錄起始點的X座標
Y.........記錄起始點的Y座標
Range.....容許手殘畫歪的範圍

接著就是在程式中加入了3個事件

MouseDown...當然就是滑鼠按下的事件...這是為了取得開始的位置...你總要知道什麼時候開始畫手勢嘛
MouseMotion..滑鼠移動的事件.......都說是滑鼠手勢了...當然就是滑鼠動的時候要有記錄丫
MouseLeft.....滑鼠放開的事件......有始有終囉


然後...有coding的部份當然除了給初始值外就是這3個事件囉
以下為三個事件的Souse Code ... 有興趣就看看吧..

/*!
* wxEVT_LEFT_DOWN event handler for ID_HELLOMOUSE
*/
void HelloMouse::OnMouseLeftDown( wxMouseEvent& event )
{
X = event.m_x;
Y = event.m_y;

printf("oh...%d,%d\n",X,Y);
}


/*!
* wxEVT_MOTION event handler for ID_HELLOMOUSE
*/
void HelloMouse::OnMouseMotion( wxMouseEvent& event )
{
if(event.m_leftDown)
{
if(abs(X-event.m_x)>Range)
{
if((X>event.m_x)&&(Direction != 'L'))
{
Direction = 'L';
printf("L");
}
if((X {
Direction = 'R';
printf("R");
}
X = event.m_x;
Y = event.m_y;
}
if(abs(Y-event.m_y)>Range)
{
if((Y>event.m_y)&&(Direction != 'U'))
{
Direction = 'U';
printf("U");
}
if((Y {
Direction = 'D';
printf("D");
}
X = event.m_x;
Y = event.m_y;
}
}
}


/*!
* wxEVT_LEFT_UP event handler for ID_HELLOMOUSE
*/
void HelloMouse::OnMouseLeftUp( wxMouseEvent& event )
{
X = 0;
Y = 0;
Direction = NULL;
printf("\n");
}

沒有留言: