在使用c ++的win32 api中,我想跟踪双击和三次单击,等等

问题描述 投票:-1回答:1
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并确定消息的时间,并且与上次点击时间和坐标进行比较,以确定是否为双击。但这是行不通的。可能是我对我是新手的方法不对。请您帮我解决这个问题。

 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);

   }
c++ winapi mouseevent
1个回答
0
投票

您可以使用SetTimer,单击一次后,不立即将其判断为一次单击,而是启动计时器,检查计时器范围内是否还有另一次单击,如果存在,则判断为双击,如果否,并且上次时间确定为一次单击。

SetTimer

并确保您的窗口没有#define TIMER_ID 10 static int click_count = 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) { MessageBox(hWnd, TEXT("click"), _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

© www.soinside.com 2019 - 2024. All rights reserved.