设置一个时钟,比如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);
}
       

解决方案 »

  1.   

    这个方法不行的.
    因为第二次鼠标按下的时候系统产生的是WM_LBUTTONDBLCLK而不是WM_LBUTTONDOWN消息.
    而且用200ms的定时器是不是太频繁了?很有可能在三次鼠标消息之间插了一个TIMER消息,输入就丢失了.有没有其他办法?
      

  2.   

    那就先WM_LBUTTONDBLCLK后WM_LBUTTONDOWN?
      

  3.   

    时间应该取
    GetDoubleClickTime()
      

  4.   

    有没有有点建设性的意见啊...难点是不能按常规顺序发送WM_LBUTTONDBLCLK消息,而是必须等待短暂的时间,如果没有再次输入就发送WM_LBUTTONDBLCLK,否则发送三击消息.这个消息循环可能非常复杂了
      

  5.   

    呼呼!不容易啊,终于成了!
    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);
    }
      

  6.   

    多谢w12兄的热心指点,不过和我预想的效果有点不大一样.
    我想的是:如果在很短的时间内连按了三次鼠标,就直接发送三击消息而不发送双击消息.w12兄做出来的效果和Word里面的是一样的,就是双击和三击的消息都发出了,我最头疼的是怎么栏住双击消息,等短时间内用户没有再次输入再发出去.难道我要再起一个线程?
      

  7.   

    当我点了2次后你怎么知道我是否要点第3次呢?
    如我点,你因该视为“三击”;
    如不点,你因该视为“双击”;
    普通的方法不行。
    这样行不行?:
    在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()后,自己设置三个变量的值等。
      

  8.   

    试验...好象不行...在第二次的时候是WM_LBUTTONDBLCLK,第二个DOWN根本就发不出来.而且怎么截住DBLCLK呢?
    难!难!难!
      

  9.   

    挂一个鼠标钩子,在 WM_LBUTTONDBCLK,到来时设置一个标志 记下系统时间,如用
    GetTickCount 然后 return 不调用 CallNext.... ,当WM_LBUTTONDWON到来时
    查看 标志和时间是否都满足,如是 发送自定义消息 Postmessage,如不满足 
    CallNext...(函数名记不住了)
      

  10.   

    挂一个鼠标钩子,在 WM_LBUTTONDBCLK,到来时设置一个标志 记下系统时间,如用
    GetTickCount 然后 return 不调用 CallNext.... ,当WM_LBUTTONDWON到来时
    查看 标志和时间是否都满足,如是 发送自定义消息 Postmessage,如不满足 
    CallNext...(函数名记不住了)
      

  11.   

    微软的办法:处理完双击后(因为双击的操作相对较少),存一个变量,然后重载一个单击的消息函数。
    此处理方法来自msdn.micro$oft.com/....
    文档编号:1234567
    哈哈!!
      

  12.   

    ahphone(阿丰)的办法应该可以,不过得加计数器。
      

  13.   

    真的假的啊...我一看见那个文档编号就觉得有问题...不过M$的网站我还从没去过,好,去瞧瞧.
    fd兄的也是一个思路,钩子到没有考虑过,虽然似乎有点小题大作,不过如果能解决问题的话也认了.我这就去试试,希望有结果吧.
      

  14.   

    这次我是由备而来啊!
    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);
      

  15.   

    多谢、多谢!我这就去试!再加30分,以表感谢!
    BTW:为什么M$的网站总是进不去?