测试目的是:我在工具栏中选中发送按键,按下鼠标左键一直不放就运行一个自动累加的函数,当我释放左键时停止自动累加,我试过很多办法都得不到鼠标左键按下与释放的消息,希望高手能给予帮助,谢谢了.

解决方案 »

  1.   

    直接写一个toolbarex类继承一下toolbar,在内部截取消息处理!
    使用PreTranslateMessage来截取鼠标按下与弹起!
    然后,CToolBar::GetItemRect来取得rect,最后,判断如果按下后,就用一个定时器不停的做你想做的事,直到鼠标弹起,删除定时器!
      

  2.   

    由于对MFC懂的不是太深,弱弱的问一问,我在CToolBar中使用GetItemRect得到的CRect,与鼠标如果对应呢?调用ScreenToClient()转换,还是调用ClientToWindow()转换呢?
      

  3.   

    当然还有一种方法就是截取TOOLBAR的消息WNDPROC  oriprocT;  
    LRESULT  yourprocT(HWND,  UINT,  WPARAM,  LPARAM); 在CMainFram::OnCreate()工具栏创建之后调用. 
    oriprocT= (WNDPROC)GetWindowLong(m_wndCommon_ToolBar.m_hWnd, GWL_WNDPROC);  
    SetWindowLong(m_wndCommon_ToolBar.m_hWnd, GWL_WNDPROC,  (long)yourprocT);  
    LRESULT  yourprocT(HWND  h,  UINT  u,  WPARAM  w,  LPARAM  l)  
    {  
    if(u == WM_ONLBUTTOMDOWN) //来截取鼠标按下与弹起
    {  
    //自己处理代码
    }  
    return  oriprocT(h, u, w, l);  

      

  4.   

    m_wndToolBar.SetButtonInfo(0,ID_BLANK,TBBS_SEPARATOR,titleWidth);
    m_wndToolBar.SetButtonInfo(i,ID_FILE_FIND,TBSTYLE_BUTTON,0);
    m_wndToolBar.SetButtonInfo(i+1,IDC_UV_SHUTTER,TBSTYLE_BUTTON,1);
    m_wndToolBar.SetButtonInfo(i+2,IDC_FLUSH,TBSTYLE_BUTTON,2);
    ....
    m_wndToolBar.SetButtonInfo(i+14,ID_BAK,TBBS_SEPARATOR,14);如果重载CToolBar,那么在:
    BOOL CToolBxx::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    if(pMsg->message == WM_LBUTTONUP)
    {
    CRect rect;
    for(int i=0;i<14;i++)
    {
    GetItemRect(i,&rect);
    CPoint pt;
    pt.x=LOWORD(pMsg->lParam); 
    pt.y=HIWORD(pMsg->lParam); if(rect.PtInRect(pt))
    {
    //选中的菜单项
    Add();
    .....
    break;
    }

    }
    }
    if(pMsg->message == WM_LBUTTONDOWN)
    {
    CRect rect;
    for(int i=0;i<14;i++)
    {
    GetItemRect(i,&rect);
    CPoint pt;
    pt.x=LOWORD(pMsg->lParam); 
    pt.y=HIWORD(pMsg->lParam); if(rect.PtInRect(pt))
    {
    //选中的菜单项
    Stop();
    .....
    break;
    }

    }
    }
    return CToolBarCtrl::PreTranslateMessage(pMsg);
    }
    这样的思路是不是正确的呢?
      

  5.   

    看了你的代码,我觉的,应该是这样的!
    楼主可以下手了!另外,截住的鼠标按下、鼠标弹起(当然在合理的范围内),就return TRUE;
      

  6.   

    OK,星期一给大家汇报结果!
    顺便问一问是不是MFC里面的类库都可以重载PreTranslateMessage()这个函数呢?
      

  7.   

    从cwnd继承的,都可以响应消息,所以,可以重载PreTranslateMessage()!
      

  8.   


    已经实现了,但是出现了新的问题,
    我用GetItemID()得到选中按钮的ID,但是要如何让该ID在鼠标弹起时释放鼠标对该控件的选中标志呢?
      

  9.   

    使用ClipCursor()也不行呀~~怎么办??各位高手
    COLORREF bkcolor=::GetSysColor (1);
    m_ToolImageList.Create (btSize.cx,btSize.cy,ILC_COLOR24,13,13);
    for (int bmpnum=0;bmpnum<nbt-1;bmpnum++)
     {
        m_ToolImageList.Add(&m_toolbmp[bmpnum],bkcolor);
     }
    m_wndToolBar.GetToolBarCtrl ().SetImageList (&m_ToolImageList);
        m_wndToolBar.SetButtons (NULL,nbt);
    int i=1;
    m_wndToolBar.SetButtonInfo(0,ID_BLANK,TBBS_SEPARATOR,titleWidth);
    m_wndToolBar.SetButtonInfo(i,ID_FILE_FIND,TBSTYLE_BUTTON,0);
    m_wndToolBar.SetButtonInfo(i+1,IDC_UV_SHUTTER,TBSTYLE_BUTTON,1);
    m_wndToolBar.SetButtonInfo(i+2,IDC_FLUSH,TBSTYLE_BUTTON,2);
    .....
    m_wndToolBar.SetButtonInfo(i+14,ID_BAK,TBBS_SEPARATOR,14);
    AfxSetResourceHandle(hIns);BOOL CToolxx::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class

    if(pMsg->message == WM_LBUTTONUP)
    {
    CRect rect;
    for(int i=0;i<14;i++)
    {
    GetItemRect(i,&rect);
    CPoint pt;
    pt.x=LOWORD(pMsg->lParam); 
    pt.y=HIWORD(pMsg->lParam);
    CWnd* pWnd;
    if(rect.PtInRect(pt))
    {
    //选中的菜单项
    //Add();
    if(!sys.m_hDevice)

    // AfxMessageBox("没有找到USB设备,请重新启动USB设备!");
    // return FALSE;
    }
    switch(i)
    {
    case 5:
    // sys.SendLeftEnd();               ClipCursor(NULL);
    break;
    case 6:
    sys.SendRightEnd();
    break;
    case 7:
    sys.SendHeadEnd();
    break;
    case 8:
    sys.SendBackEnd();
    break;
    default:
    break;
    }
    }

    }
    }
    if(pMsg->message == WM_LBUTTONDOWN)
    {
    CRect rect;
    for(int i=0;i<14;i++)
    {
    GetItemRect(i,&rect);
    CPoint pt;
    pt.x=LOWORD(pMsg->lParam); 
    pt.y=HIWORD(pMsg->lParam); if(rect.PtInRect(pt))
    {
    if(!sys.m_hDevice)

    // AfxMessageBox("没有找到USB设备,请重新启动USB设备!");
    // return FALSE;
    }
    switch(i)
    {
    case 5:
    nCount+=1;
    LeftFlag  = FALSE;
    //SetCapture();
    //sys.SendLeftStart();
    break;
    case 6:
    RightFlag = FALSE;
    //sys.SendRightStart();
    break;
    case 7:
    HeadFlag  = FALSE;
    //sys.SendHeadStart();
    break;
    case 8:
    BackFlag  = FALSE;
    //sys.SendBackStart();
    break;
    default:
    break;
    }
    PushFlag  = FALSE;
    }
    }
    } return CToolBar::PreTranslateMessage(pMsg);
    }当左键释放时,工具栏上的按钮还是选中的状态!各位怎么取消这个选中的状态呢??
      

  10.   

    现在只能将光标移动到别的按钮,
    GetItemRect(4,&rect);
    ::ClientToScreen(pMsg->hwnd,&rect.BottomRight());
    SetCursorPos(rect.BottomRight().x-1,rect.BottomRight().y-50);
    各位高手有没有其他的建议呀!!麻烦将思路告诉我了!先谢谢了
      

  11.   

    鼠标放到按钮上面,的确会有捕捉状态的,这个是正常的,是不是你特别做了什么处理了?
    另外,pMsg->message == WM_LBUTTONUP这类消息,如果正好是你使用的,用后你干脆return TRUE得了,其它的消息,调用return CToolBar: reTranslateMessage(pMsg);