在使用 c++ 的 win32 api 中,我想跟踪双击和三次单击等
In win32 api using c++ i want to track double click and triple click and so on
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);
}
}
这是我为处理双击而制定的功能: 当窗口收到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);
}
可以使用SetTimer
,一次点击后,不要立即判断为点击,而是启动计时器,检查计时器范围内是否有另一次点击,如果有,则判断为双击,如果没有,则确定为单点击。
#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
消息: 双击
相关文章:
- QTreeView幻灯片多选后无法使用单击选择
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- QML TableView 使用 QtQuick.Controls 2 单击行
- ImGui 在单击按钮后冻结
- 有没有办法区分Qt小部件是通过鼠标单击还是通过按表键获得焦点?
- 我想使用此代码单击某个特定窗口,但它无法正常工作
- 如何在QSplashScreen中禁用鼠标单击
- 单击一个按钮后创建一个按钮
- C++鼠标单击时的屏幕截图不起作用
- 我的主窗口在创建时或单击更新区域时是否会收到编辑控件?
- 标签检测鼠标单击 c++
- 如何将我的程序添加到文件和文件夹的macOS右键单击菜单?
- 使用 SFML 在矩形的矢量中查找鼠标单击量
- 在单击 QPushButton 时调用带有参数的函数
- 如何在单击按钮FLTK的确切时刻获得小部件的值
- 在使用 c++ 的 win32 api 中,我想跟踪双击和三次单击等
- QGraphicsScene 中的 QPushButton 需要双击而不是单击
- QListWidget 项目单击和项目双击 - 如果双击,则阻止单击
- 双击(触摸)按屏幕按钮的原因可能是什么,该按钮通过单击鼠标按下
- 如何在mfc中处理单击和双击同一按钮