大家好,我是从VB版跑过来的。因为MYIE的源码是VC的,所以跑到这里请教大家。它的“鼠标手势”是如何实现的?研究过的朋友可否告知,特别是“鼠标右键向左再向右”(或向上再向下)的手势如何实现。100分相送。
解决方案 »
- VS2008 SP1中的CMFCTabCtrl的问题
- 请教一个ATL回调函数的问题
- 在DLL中如何添加插入菜单代码?
- 无模式对话框问题-急,在线等
- 一个郁闷的问题,使用gethostbyaddr函数发生异常,请高手指点迷津
- 我写了一个ATL com控件,支持MFC类库,但是我到一台干净的机器上去注册控件,报注册控件失败,请问各位高手,支持它的插件有哪些?
- 用App Wizard下的数据库对话框可连接数据库,但自己原封不动的手写就不行,为什么呢?
- 关于字符串操作的问题!
- 帮我看看问题出在什么地方!
- lib的问题,请高手前来解答
- 如何编程获取mx(VC语言)
- 参数 数据 传输 问题 在线等 急。。。
AfxGetApp
CWinApp::LoadCursor
我觉得timer这样做好像效率不高。
我有点想法这个事件,起始于(右键被按下),终止于(右键被松开)。为什么要用timer呢?鼠标动作的消息函数不就够了吗?
只要检测到右键if (rightbutton_down) {first_x=mouse.x;first_y=mouse.y;}然后启用mouse_move的事件,每移动一点,就把当前位置记录下来final_x。在mouse_move事件内部的最后,比较 final_x/y - first_x/y 的大小。根据其数值变化,当超过某一个预定的值时, 来确定是否发出其对应的动作。-------------
这样不就可以省掉timer吗?
不知道正确否。还请高手来说两句。
我花了一晚的时间从里面找到了这一段代码:
#define RBUT_LEFT 'L'
#define RBUT_RIGHT 'R'
#define RBUT_UP 'U'
#define RBUT_DOWN 'D'void CMyIEView::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
try{ if(m_bIsCapture)
{
m_bIsCapture = FALSE;
ReleaseCapture();
int i =0; m_SeqMG[0]= '\0';
while(m_iMouseGE != m_iMouseGS)
{
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)
{
// TODO: Add your command handler code here
switch(pMainFrame->m_nNewWindow2)
{
case 0:
pMainFrame->PostMessage(WM_COMMAND, ID_FILE_NEW_BLANK, 0);
break;
case 1:
pMainFrame->PostMessage(WM_COMMAND, ID_FILE_NEW_S, 0);
break;
case 2:
pMainFrame->PostMessage(WM_COMMAND, ID_FILE_NEW_CURRENTPAGE, 0);
}
}
else if(strcmp(m_SeqMG, "L")==0)
GoBack();
else if(strcmp(m_SeqMG, "R")==0)
GoForward();
else if(strcmp(m_SeqMG, "UD")==0)
Refresh2(REFRESH_COMPLETELY);
else if(strcmp(m_SeqMG, "RLR")==0 || strcmp(m_SeqMG, "DR")==0)
pMainFrame->PostMessage(WM_COMMAND, ID_FILE_CLOSE_1, 0);
else if(strcmp(m_SeqMG, "UL")==0)
pMainFrame->PostMessage(WM_COMMAND, ID_TAB_PRE, 0);
else if(strcmp(m_SeqMG, "UR")==0)
pMainFrame->PostMessage(WM_COMMAND, ID_TAB_NEXT, 0);
else
i = 0;
}
if(i==0)
{
//popup right menu;
POINT p2 = point;
ClientToScreen(&p2);
m_pCaptured = WindowFromPoint(p2);
if(m_pCaptured)
{
m_pCaptured->ScreenToClient(&p2);
m_pCaptured->PostMessage(WM_RBUTTONUP, nFlags, MAKELONG(p2.x, p2.y));
// m_bRClick = TRUE;
// QueryPerformanceCounter(&m_tLastRClick);
}
}
}
}catch(...)
{
} CFixedHtmlView::OnRButtonUp(nFlags, point);
}void CMyIEView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
try{
if(m_bIsCapture && nFlags == MK_RBUTTON)
{
char dir;
if(MoveDirection(point, &dir))
{
PushMouseGesture(dir);
m_StartPoint = point;
}
} }catch(...)
{
} CFixedHtmlView::OnMouseMove(nFlags, point);
}void CMyIEView::PushMouseGesture(char gesture)
{
if(m_iMouseGE!=0 || m_iMouseGS !=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;}BOOL CMyIEView::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;
}我不懂VC,不知道我找的代码片段对不对。帖出来,让大家帮忙帮忙,说说它的大概意思。
另外这个是MYIE的早期版本,所以只有简单的“鼠标手势”。我还想向大家请教“鼠标右键向左再向右”(或向上再向下)的比较难的手势如何实现。麻烦大家了。
我不太明白 向上在向下是什么意思。按我的理解和实验。myie2。当你监测轨迹的时候,一旦在某个轴向上,坐标的位移超过了比如说向上1cm。那么就记录一个向上的动作。然后把起始坐标改成刚才记录后的坐标重新开始。最后OnRightbuttonUp了后,才执行记录下的一系列动作。是这段代码,就是好几个地方的变量,特别是OnRButtonUp 里面的i,我没看明白。所以流程还是不太清楚。但思路应该没问题这样。
这么多高人。
不过解析鼠标移动轨迹的动作不是在OnRButtonUp中,而是在OnMouseMove中及时判断的,并且把每次的位移方向储存到字符数组m_MouseGestures中。
MoveDirection函数,解析鼠标移动到的位置和鼠标右键按下的位置(因为这条线不可能是沿着垂直或者水平的,所以按直角3角形的斜边处理)。斜边长大于64,则分析斜边的方向,分别返回(注意RBUT_RIGHT、RBUT_LEFT、RBUT_DOWN、RBUT_UP这几个都是宏,分别于字符R、L、D、U对应表示右、左、下、上)PushMouseGesture函数,把指定方向字符压入m_MouseGestures数组。先判断方向是否与上一次的方向相同,相同则不作处理,不同则返回。OnMouseMove函数就比较简单了,在m_bIsCapture 为真和鼠标右键按下状态的时候调用上面两个函数解析鼠标动作。OnRButtonUp函数清空m_bIsCapture,并根据m_MouseGestures字符数组(字符串)而执行相应操作。前面也分析了m_MouseGestures是如何被操作的,此时可能是"RLR",这就是你说的“鼠标右键向左再向右”了。
在MOve里记录这些点和时间差,.
在Up的时候ReleaseCap,.离散,取样那些数据.