当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 用鼠标手势动作来发送命令

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 用鼠标手势动作来发送命令


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 109 ::
收藏到网摘: n/a

用鼠标手势动作来发送命令


作者:Bborn


下载源代码


在一些比较不错的浏览器中,出现了一些新的功能,通过鼠标动作(也称鼠标手势Mouse Gestures)来发出一些命令,比如opera,myie2.一般是这样,先按住鼠标右键,不要松,然后画直线或者其他设定的路径,就可以完成指定的命令。下面我们就来实现这个功能,具体的核心代码来自共享软件联盟小树冲浪浏览器中,整理改编了其中的一些地方。


1.建立一个对话框程序,声明以下变量和函数

 BOOL m_bIsCapture;//一个标志变量 char m_MouseGestures[4], m_SeqMG[4];//用来保存鼠标动作的代码U(上) D(下)等.. int m_iMGLen; int m_iMouseGS, m_iMouseGE; POINT m_StartPoint; //鼠标的坐标点 BOOL MoveDirection(CPoint& point, char* Direction); //判断鼠标的简单动作,四个,上下左右 void PushMouseGesture(char gesture);//把鼠标动作的代码保存起来 
2.在对话框中加一个文本框,增加它的CString变量,m_mouse,用来显示鼠标的动作


3.重载OnMouseMove的函数,如下
 if( nFlags == MK_RBUTTON) //判断时候鼠标右键按下 { if (m_bIsCapture) //初始的值的TRUE, 只有当第一点的时候发生里面的动作 { m_bIsCapture=FALSE; SetCapture(); //捕获鼠标 m_StartPoint = point; //记录初始坐标点 } char dir; if(MoveDirection(point, &dir)) //调用函数 { PushMouseGesture(dir); m_StartPoint = point; } } CDialog::OnMouseMove(nFlags, point);} 
4.判断鼠标动作的函数 (核心),个人认为是很巧妙而且简单的算法:
BOOL Cmouse2Dlg::MoveDirection(CPoint &point, char *Direction){ int x = point.x - m_StartPoint.x; int y = point.y - m_StartPoint.y; int dist = x*x+y*y; if(dist>64) { if(x>abs(y) && x>0) *Direction = RBUT_RIGHT; else if(abs(x)>abs(y) && x<0) *Direction = RBUT_LEFT; else if(y>abs(x) && y>0) *Direction = RBUT_DOWN; else if(abs(y)>abs(x) && y<0) *Direction = RBUT_UP; else return FALSE; return TRUE; } else return FALSE;}
5.PushMouseGesture函数

这个函数主要是将鼠标的动作保存到m_MouseGestures中,等以后调用
if(m_iMouseGE!=0 || m_iMouseGS !=0) //m_iMouseGS和m_iMouseGE初始为0 { int pre = (m_iMouseGE -1 + m_iMGLen)m_iMGLen; if(m_MouseGestures[pre] == gesture) return; } m_MouseGestures[m_iMouseGE] = gesture; m_iMouseGE = (m_iMouseGE+1)m_iMGLen; if(m_iMouseGS == m_iMouseGE) m_iMouseGS = (m_iMouseGS + 1)m_iMGLen;
6.重载OnRButtonUp函数,这是最后触发的动作,命令处理都在这里
if(!m_bIsCapture) //看标志变量,是否触发了鼠标动作 { m_bIsCapture=TRUE; ReleaseCapture(); int i =0; m_SeqMG[0]= ''\0''; while(m_iMouseGE != m_iMouseGS) //将鼠标动作保存到m_SeqMG中,并在最后加上\0 { m_SeqMG[i] = m_MouseGestures[m_iMouseGS]; i++; m_SeqMG[i] = ''\0''; m_iMouseGS = (m_iMouseGS +1)m_iMGLen; } if(i>0) //开始比较鼠标动作,在这里可以加上自定义的动作和命令! { if(strcmp(m_SeqMG, "D")==0) m_mouse="Down"; else if(strcmp(m_SeqMG, "L")==0) m_mouse="Left"; else if(strcmp(m_SeqMG, "U")==0) m_mouse="Up"; else if(strcmp(m_SeqMG, "R")==0) m_mouse="Right"; else if(strcmp(m_SeqMG, "UD")==0) m_mouse="Up Down"; else if(strcmp(m_SeqMG, "RLR")==0) m_mouse="Right Left Right"; else if(strcmp(m_SeqMG, "UL")==0) m_mouse="Up Left"; else if(strcmp(m_SeqMG, "UR")==0) m_mouse="Up Right"; else { m_mouse=""; i = 0; } } UpdateData(FALSE); }
7.在文档试图程序中是差不多