大家好,我是从VB版跑过来的。因为MYIE的源码是VC的,所以跑到这里请教大家。它的“鼠标手势”是如何实现的?研究过的朋友可否告知,特别是“鼠标右键向左再向右”(或向上再向下)的手势如何实现。100分相送。

解决方案 »

  1.   

    资源编辑的时候新建一个光标资源,画为手型,然后使用:
    AfxGetApp
    CWinApp::LoadCursor
      

  2.   

    我想楼主是要问如何实现"鼠标右键向左再向右”(或向上再向下)的手势如何实现"这些MOUSE动作的对应功能,不是显示一个光标吧
      

  3.   

    应该是在每次鼠标移动时先记录下当前鼠标位置,然后启动一个时间事件A(如10毫秒),当时间事件A触发后KILLTIME(A),然后检测此时的鼠标位置,再根据两次的鼠标位置来确定应该执行什么操作
      

  4.   

    OnRButtonDown设定一个flag,OnMouseMove里如果flag被设置则记录移动轨迹,OnRButtonUp清除flag,并分析记录的鼠标移动轨迹
      

  5.   

    luxingjyp说的是不错。
    我觉得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吗?
    不知道正确否。还请高手来说两句。
      

  6.   

    晕。我的贴发晚了一点。又多了一楼。我的意思也是 pomelowu(羽战士) 那个意思。
      

  7.   

    都说VC版人气旺,今天真的亲身体会到了。谢谢大家。这是MYIE的源代码:http://free.efile.com.cn/biku/myie32src.rar
    我花了一晚的时间从里面找到了这一段代码:
    #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的早期版本,所以只有简单的“鼠标手势”。我还想向大家请教“鼠标右键向左再向右”(或向上再向下)的比较难的手势如何实现。麻烦大家了。
      

  8.   

    您强~ 
    我不太明白 向上在向下是什么意思。按我的理解和实验。myie2。当你监测轨迹的时候,一旦在某个轴向上,坐标的位移超过了比如说向上1cm。那么就记录一个向上的动作。然后把起始坐标改成刚才记录后的坐标重新开始。最后OnRightbuttonUp了后,才执行记录下的一系列动作。是这段代码,就是好几个地方的变量,特别是OnRButtonUp 里面的i,我没看明白。所以流程还是不太清楚。但思路应该没问题这样。
      

  9.   

    ding le!!!
    这么多高人。
      

  10.   

    有意思。大概跟我的猜测差不多。
    不过解析鼠标移动轨迹的动作不是在OnRButtonUp中,而是在OnMouseMove中及时判断的,并且把每次的位移方向储存到字符数组m_MouseGestures中。
      

  11.   

    >我还想向大家请教“鼠标右键向左再向右”(或向上再向下)的比较难的手势如何实现。你贴出来的代码已经支持你说的功能了。我简单说说各个函数的作用。
    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",这就是你说的“鼠标右键向左再向右”了。
      

  12.   

    忘记在IE组建上这些MouseDown和Up的是不是好使了.还是简单API处理一下鼠标的消息吧.Down的时候设置标志位, 并且SetCapture
    在MOve里记录这些点和时间差,.
    在Up的时候ReleaseCap,.离散,取样那些数据.