测试目的是:我在工具栏中选中发送按键,按下鼠标左键一直不放就运行一个自动累加的函数,当我释放左键时停止自动累加,我试过很多办法都得不到鼠标左键按下与释放的消息,希望高手能给予帮助,谢谢了.
解决方案 »
- 多线程使用vector 的同步问题
- 关于用CAsyncSocket传递数据的问题
- 为什么FindResourceEx去找string的时候总找不到?
- 如何向托盘的弹出菜单动态增加删除菜单项啊?(对话框)
- 什么是环形缓冲区?
- 大家帮忙推荐几个com/com+方面的网站
- 菜单问题:如何在应用程序初始化的时候Disabled某些指定的菜单项?
- 如何显示或者隐藏ToolBar?
- 用什么函数能够得到Unicode字符串的宽度(我是指以象素为单位)?
- 3.在单文档中切换多个视.加入一个视不知为什么它总是说未定义?(龙星)
- 请问vc CHotKeyCtrl控键 如何改变颜色?
- 对话框里面的编辑控件的OnChar函数如何调用对话框类里面的自定义函数
使用PreTranslateMessage来截取鼠标按下与弹起!
然后,CToolBar::GetItemRect来取得rect,最后,判断如果按下后,就用一个定时器不停的做你想做的事,直到鼠标弹起,删除定时器!
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);
}
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);
}
这样的思路是不是正确的呢?
楼主可以下手了!另外,截住的鼠标按下、鼠标弹起(当然在合理的范围内),就return TRUE;
顺便问一问是不是MFC里面的类库都可以重载PreTranslateMessage()这个函数呢?
已经实现了,但是出现了新的问题,
我用GetItemID()得到选中按钮的ID,但是要如何让该ID在鼠标弹起时释放鼠标对该控件的选中标志呢?
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);
}当左键释放时,工具栏上的按钮还是选中的状态!各位怎么取消这个选中的状态呢??
GetItemRect(4,&rect);
::ClientToScreen(pMsg->hwnd,&rect.BottomRight());
SetCursorPos(rect.BottomRight().x-1,rect.BottomRight().y-50);
各位高手有没有其他的建议呀!!麻烦将思路告诉我了!先谢谢了
另外,pMsg->message == WM_LBUTTONUP这类消息,如果正好是你使用的,用后你干脆return TRUE得了,其它的消息,调用return CToolBar: reTranslateMessage(pMsg);