在使用 c++ 的 win32 api 中,我想跟踪双击和三次单击等 [英] In win32 api using c++ i want to track double click and triple click and so on

查看:100
本文介绍了在使用 c++ 的 win32 api 中,我想跟踪双击和三次单击等的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

LRESULT handleDoubleClicks(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, POINT ptLastClickPos, DWORD dwLastClickTime)
{
    DWORD dwClickTime = GetMessageTime();
    POINT ptClickPos = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
    switch(message)
    {
    case  WM_LBUTTONDOWN:
        if (dwLastClickTime + GetDoubleClickTime() > dwClickTime
            && abs(ptLastClickPos.x - ptClickPos.x) < GetSystemMetrics(SM_CXDOUBLECLK)
            && abs(ptLastClickPos.y - ptClickPos.y) < GetSystemMetrics(SM_CYDOUBLECLK))
        {
            MessageBox(hWnd, TEXT("Double click"), TEXT("I appear when double clicked"), MB_OKCANCEL);

        }
        else
        {
            dwLastClickTime = dwClickTime;
            ptLastClickPos = ptClickPos;
            wchar_t waCoord[20];
            wsprintf(waCoord, _T("(%i,%i)"), ptLastClickPos.x, ptLastClickPos.y);
            MessageBox(hWnd, waCoord, _T("Left mouse button click"), MB_OK);
        }
        break;
     default:
         return DefWindowProc(hWnd, message, wParam, lParam);
    }
}

这是我用来处理双击的功能:这个函数在windows收到WM_LBUTTONDOWN时被调用,它会占用消息的时间和点击的坐标,并将其传递给这里的函数我希望该函数接收另一条消息WM_LBUTTONDOWN 并确定消息的时间并与前一次点击时间和坐标进行比较,以识别是否为双击.但这不起作用.可能是我的方法错了,我是新手,请帮助我解决这个问题.

This is function i have made to handle double click: This function is called when windows recieve WM_LBUTTONDOWN it will take the time of the message and coordinate of the click and will transfer it to the function here i want the fuction to recieve another message WM_LBUTTONDOWN and determine the time of the message and compare with the previous click time and the co ordinates to identify if it is a double click. But this is not working .May be I am Wrong with the approach I am newbie Pls help me to solve this problem.

 case WM_LBUTTONDOWN:
   {
        dwLastClickTime= GetMessageTime();
        // SetTimer(hWnd,0,GetDoubleClickTime(),0);
        ptLastClickPos.x = LOWORD(lParam);
        ptLastClickPos.y = HIWORD(lParam);
        handleDoubleClicks(hWnd, message, wParam, lParam, ptLastClickPos, dwLastClickTime);

   }

推荐答案

您可以使用 SetTimer,点击一次后,不是立即判断为点击,而是启动定时器,检查定时器范围内是否还有一次点击,如果有,则判断为双击,如果没有,则判断前一次为单击.

You could use SetTimer, after one click, not immediately judge it as a click, but start the timer, check whether there is another click within the timer range, if there is, it is judged as double-click, if not, and the previous time is determined as a single click.

#define TIMER_ID 10
static int click_count = 0;
static POINT point = { 0 };
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_TIMER:
    {
        KillTimer(hWnd, TIMER_ID);
        if (click_count == 1)
        {
            wchar_t waCoord[20];
            wsprintf(waCoord, _T("(%i,%i)"), point.x, point.y);
            MessageBox(hWnd, waCoord, _T("Left mouse button click"), MB_OK);
        }
        else if(click_count == 2)
        {
            MessageBox(hWnd, TEXT("Double click"), TEXT("I appear when double clicked"), MB_OKCANCEL);
        }
        else if (click_count == 3)
        {
            MessageBox(hWnd, TEXT("Triple click"), TEXT("I appear when triple clicked"), MB_OKCANCEL);
        }
        click_count = 0;
        return 0;
    }
    break;
    case WM_LBUTTONDOWN:
    {
        if (click_count == 0)
        {
            SetTimer(hWnd, TIMER_ID, GetDoubleClickTime(), NULL);
        }
        click_count++;
        return 0;
    }
    break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: Add any drawing code that uses hdc here...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

并确保您的窗口没有 CS_DBLCLKS 样式.否则,根据文档,通常会生成的第二个 WM_LBUTTONDOWN 消息将变成 WM_LBUTTONDBLCLK 消息:双击

And make sure your window doesn't have CS_DBLCLKS style. Otherwise, the second WM_LBUTTONDOWN message that would normally be generated becomes a WM_LBUTTONDBLCLK message, according to the document: Double Clicks

这篇关于在使用 c++ 的 win32 api 中,我想跟踪双击和三次单击等的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆