MFC 鼠标左键单击 事件 和 橡皮筋矩形框问题。。。请各位帮忙。。。谢谢
在windows桌面上,我们可以左键单击拖拽出一个橡皮筋的矩形框,也可以左键单击触发某一种命令,不如打开文件,之间是不会受任何影响的。现在我的这个项目的问题就是,单击时无...
在windows桌面上,我们可以左键单击拖拽出一个橡皮筋的矩形框,也可以左键单击触发某一种命令,不如打开文件,之间是不会受任何影响的。现在我的这个项目的问题就是,单击时无法识别是单击触发某一种命令还是拖拽出橡皮筋,请问如何做区别呢。。。我的单击事件是控制一条动态曲线的开始和停止,橡皮筋是为了选中一定范围的图,进行缩放。谢谢
我的方法与一楼的差不多,但是不行,我这里还涉及双击事件,而双击又与单击冲突,下边是我鼠标事件的代码,请帮忙看下,OnMouseMove代码在一楼追问里,不好意思太长了。
void CNewDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
MSG msg;
DWORD dwOld = GetTickCount();
DWORD dwNew = 0;
CRect rect;
m_view.GetWindowRect(rect);
ScreenToClient(rect);
while(1)
{
if(PeekMessage(&msg, NULL, 0 ,0 , PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
if(msg.message == WM_LBUTTONDBLCLK){return;}
}
dwNew = GetTickCount();
if(dwNew - dwOld > 210){break;}
}
if( rect.PtInRect(point) )
{
m_bStartStop ^= TRUE;
if ( m_bStartStop)
{
SetTimer(1,250,NULL);
}
else
{
KillTimer(1);
}
pt_start = point;
IsLButtonDown = TRUE;
}
}
void CNewDlg::OnLButtonUp(UINT nFlags, CPoint point)
{ IsLButtonDown 展开
我的方法与一楼的差不多,但是不行,我这里还涉及双击事件,而双击又与单击冲突,下边是我鼠标事件的代码,请帮忙看下,OnMouseMove代码在一楼追问里,不好意思太长了。
void CNewDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
MSG msg;
DWORD dwOld = GetTickCount();
DWORD dwNew = 0;
CRect rect;
m_view.GetWindowRect(rect);
ScreenToClient(rect);
while(1)
{
if(PeekMessage(&msg, NULL, 0 ,0 , PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
if(msg.message == WM_LBUTTONDBLCLK){return;}
}
dwNew = GetTickCount();
if(dwNew - dwOld > 210){break;}
}
if( rect.PtInRect(point) )
{
m_bStartStop ^= TRUE;
if ( m_bStartStop)
{
SetTimer(1,250,NULL);
}
else
{
KillTimer(1);
}
pt_start = point;
IsLButtonDown = TRUE;
}
}
void CNewDlg::OnLButtonUp(UINT nFlags, CPoint point)
{ IsLButtonDown 展开
展开全部
只能给一个思路了,具体代码需要你自己写
鼠标单击会产生两个消息,比如“鼠标左键按下”会产生WM_LBUTTONDOWN的消息,“鼠标左键弹起”会产生WM_LBUTTONUP的消息;
首先,在响应WM_LBUTTONDOWN的消息函数中将两个全局的BOOL变量1,变量2都设置为TRUE,在响应WM_LBUTTONUP的消息函数中将其中的全局变量1设置为FALSE;
然后在响应鼠标移动消息(WM_MOUSEMOVE)的消息函数中判断变量1的值,如果为TRUE,表明是拖拽橡皮筋,因为这个时候鼠标左键没有弹起,这个时候将变量2设置为FALSE,表明不是单击触发命令;如果为FALSE,则是普通的鼠标移动,因为这个时候鼠标左键已经弹起来了,这个时候不要对变量2做处理;
最后,若要识别单击触发某种命令,只需在WM_LBUTTONUP消息函数中判断变量2,如果为TRUE,表明是单击触发某种命令,否则就是拖拽结束。
希望对你有帮助!
鼠标单击会产生两个消息,比如“鼠标左键按下”会产生WM_LBUTTONDOWN的消息,“鼠标左键弹起”会产生WM_LBUTTONUP的消息;
首先,在响应WM_LBUTTONDOWN的消息函数中将两个全局的BOOL变量1,变量2都设置为TRUE,在响应WM_LBUTTONUP的消息函数中将其中的全局变量1设置为FALSE;
然后在响应鼠标移动消息(WM_MOUSEMOVE)的消息函数中判断变量1的值,如果为TRUE,表明是拖拽橡皮筋,因为这个时候鼠标左键没有弹起,这个时候将变量2设置为FALSE,表明不是单击触发命令;如果为FALSE,则是普通的鼠标移动,因为这个时候鼠标左键已经弹起来了,这个时候不要对变量2做处理;
最后,若要识别单击触发某种命令,只需在WM_LBUTTONUP消息函数中判断变量2,如果为TRUE,表明是单击触发某种命令,否则就是拖拽结束。
希望对你有帮助!
追问
void CNewDlg::OnMouseMove(UINT nFlags, CPoint point)
{
if( (IsLButtonDown) && ((et - st) > 500) )
{
m_TraKer.TrackRubberBand(this,point,TRUE);
m_TraKer.m_rect.NormalizeRect();
pt_end=point;
SendMessage(WM_LBUTTONUP,NULL,NULL);
n=4;
}
}
void CNewDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
IsLButtonDown=FALSE;
}
追答
双击事件 不是有自己的消息处理函数吗
你的代码我看不懂,左键按下的消息里去做消息循环是什么意思
看来我帮不了你
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询