设置一个时钟,比如2秒,
设置一个计数器,记录鼠标点击次数,每次响应时钟把计数器清0int i=0;
SetTimer(1,200);void CssDialog::OnLButtonDown(UINT nFlags, CPoint point)
{
if(i<3)
i++;
else
i=0;
CDialog::OnLButtonDown(nFlags, point);
}void CssDialog::OnTimer(int ID)
{ switch(id)
case 1:
if(i=3)
MessageBox("NULL","ok","鼠标点了三下",MB_OK);
i=0;
break;
CDialog::OnTimer(nIDEvent);
}
设置一个计数器,记录鼠标点击次数,每次响应时钟把计数器清0int i=0;
SetTimer(1,200);void CssDialog::OnLButtonDown(UINT nFlags, CPoint point)
{
if(i<3)
i++;
else
i=0;
CDialog::OnLButtonDown(nFlags, point);
}void CssDialog::OnTimer(int ID)
{ switch(id)
case 1:
if(i=3)
MessageBox("NULL","ok","鼠标点了三下",MB_OK);
i=0;
break;
CDialog::OnTimer(nIDEvent);
}
解决方案 »
- mfc子窗口创建问题
- MFC怎么让程序把执行两次button控件的消息映射函数
- ActiveX的3个问题!急求!
- 请教关于dll中函数内的static变量
- 请问各位哪里有 PHOTOSHOP 5。0 软件的下载,急,在线等。
- VC++中有没有求四舍五入的函数有,写出来
- sty是什么格式的文件?用什么软件能打开??
- 自己做的报表组件:ACReport报表控件的最新版本(含文档和demo)
- oracle调用C连接库问题 在线等 谢谢
- 在Win32动态链接库中怎么使用CTime类呢?
- 请教:关于安装程序制作
- 我定义了一个自定义消息,可是我怎么才能知道我定义的消息不和别人定义的消息重复呢! 所以编程方法解决吗!我们老板说能解决!我很晕啊!!!
因为第二次鼠标按下的时候系统产生的是WM_LBUTTONDBLCLK而不是WM_LBUTTONDOWN消息.
而且用200ms的定时器是不是太频繁了?很有可能在三次鼠标消息之间插了一个TIMER消息,输入就丢失了.有没有其他办法?
GetDoubleClickTime()
void click_3()
{
}BOOL CDlgApp::PreTranslateMessage(MSG* pMsg)
{
static short flag=0;
UINT time;
static DWORD t1,t2,t3=20000;
time=GetDoubleClickTime();
if((pMsg->message == WM_LBUTTONDBLCLK )||(pMsg->message ==WM_LBUTTONDOWN))
{
if(pMsg->message == WM_LBUTTONDBLCLK )
{
t1=GetTickCount();
flag=1;
}
if(pMsg->message == WM_LBUTTONDOWN)
{
if(flag==1)
{
t2=GetTickCount();
t3=t2-t1;
if(t3<time)
{
click_3();
flag=0;
return true;
}
flag=0;
}
} }
return CWinApp::PreTranslateMessage(pMsg);
}
我想的是:如果在很短的时间内连按了三次鼠标,就直接发送三击消息而不发送双击消息.w12兄做出来的效果和Word里面的是一样的,就是双击和三击的消息都发出了,我最头疼的是怎么栏住双击消息,等短时间内用户没有再次输入再发出去.难道我要再起一个线程?
如我点,你因该视为“三击”;
如不点,你因该视为“双击”;
普通的方法不行。
这样行不行?:
在CMyView里处理WM_LBUTTONDOWN,记录当时的系统时间,比较后发出自己的“成员函数”调用。
void CMyView::OnLButtonDown(...,CPoint point)
{
m_dwT1=GetSyeTime();//...??? DWORD t12,t13;
t12=m_dwT1-m_dwT2;
t13=m_dwT1-m_dwT3; if(t13<TIME_CLICK3) //一定“短”时间范围内第三次点。
{
DoClick3(point);
}
else if(t12>TIME_CLICK2_OUT) //点了两次,但总不点“本以为会有的”第三次,
{
if(t12<TIME_CLICK2)
DoClick2(point);
else
DoClick1(point);
}
m_dwT3=m_dwT2;
m_dwT2=m_dwT1;
}
当然还有很多要做,比如三个变量的初始化问题,或者验证m_dwT3比m_dwT1大(或相等)时的情况等。或者,当“完成一次确定”后,比如执行DoClick3()后,自己设置三个变量的值等。
难!难!难!
GetTickCount 然后 return 不调用 CallNext.... ,当WM_LBUTTONDWON到来时
查看 标志和时间是否都满足,如是 发送自定义消息 Postmessage,如不满足
CallNext...(函数名记不住了)
GetTickCount 然后 return 不调用 CallNext.... ,当WM_LBUTTONDWON到来时
查看 标志和时间是否都满足,如是 发送自定义消息 Postmessage,如不满足
CallNext...(函数名记不住了)
此处理方法来自msdn.micro$oft.com/....
文档编号:1234567
哈哈!!
fd兄的也是一个思路,钩子到没有考虑过,虽然似乎有点小题大作,不过如果能解决问题的话也认了.我这就去试试,希望有结果吧.
void click_3()
{
}BOOL CDlgApp::PreTranslateMessage(MSG* pMsg)
{ static short flag=0,flagtime=0;
UINT time;
static MSG tempMsg;
static DWORD t1,t2,t3=20000;
time=GetDoubleClickTime();
t2=GetTickCount();
if((pMsg->message == WM_LBUTTONDBLCLK )||(pMsg->message ==WM_LBUTTONDOWN))
{
if(pMsg->message == WM_LBUTTONDBLCLK )
{
t1=GetTickCount();
flag=1;flagtime=1;
tempMsg.hwnd =pMsg->hwnd;
tempMsg.message=pMsg->message;
tempMsg.lParam=pMsg->lParam;
tempMsg.wParam=pMsg->wParam;
return true;
}
if(pMsg->message == WM_LBUTTONDOWN)
{
if(flag==1)
{
t2=GetTickCount();
t3=t2-t1;
if(t3<time)
{
click_3();
flag=0;flagtime=0;
return true;
}
flag=0;
}
} }else{
if(flagtime)
{
t3=t2-t1;
if(t3>time)
{
flagtime=0;
return CWinApp::PreTranslateMessage(&tempMsg);
}
}
}
return CWinApp::PreTranslateMessage(pMsg);
BTW:为什么M$的网站总是进不去?