如何检索WM_COMMAND中的鼠标位置
How to retrieve mouse position inside WM_COMMMAND
可能重复:
获取当前光标位置
我创建了这样的按钮:
button = CreateWindowEx(NULL,_T("Button"),NULL,
WS_CHILD | WS_VISIBLE | BS_BITMAP | BS_NOTIFY ,
pos.x, pos.y, BTN_SIZE, BTN_SIZE,
hWndDlg, (HMENU)id,hIns, NULL);
我想拖动那个按钮,想不出如何获得鼠标位置X,Y相对对话框窗口?谢谢你的帮助?
您收到的消息包含一个名为pt
的POINT
结构。至少对于任何源自鼠标的消息,这是消息发出时鼠标的位置。这是在屏幕坐标中,所以您需要使用ScreenToClient
或(最好)MapWindowPoints
来获得相对于对话框的坐标。
试试这段代码,看看你是否能找到一些东西。
#include <windows.h>
#include <stdio.h>
#define IDC_MAIN_BUTTON 101 // Button identifier
#define IDC_MAIN_EDIT 102 // Edit box identifier
HWND hEdit;
LRESULT CALLBACK WinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nShowCmd)
{
WNDCLASSEX wClass;
ZeroMemory(&wClass,sizeof(WNDCLASSEX));
wClass.cbClsExtra=NULL;
wClass.cbSize=sizeof(WNDCLASSEX);
wClass.cbWndExtra=NULL;
wClass.hbrBackground=(HBRUSH)COLOR_WINDOW;
wClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wClass.hIcon=NULL;
wClass.hIconSm=NULL;
wClass.hInstance=hInst;
wClass.lpfnWndProc=(WNDPROC)WinProc;
wClass.lpszClassName="Window Class";
wClass.lpszMenuName=NULL;
wClass.style=CS_HREDRAW|CS_VREDRAW;
if(!RegisterClassEx(&wClass))
{
int nResult=GetLastError();
MessageBox(NULL, "Window class creation failedrn", "Window Class Failed", MB_ICONERROR);
}
HWND hWnd=CreateWindowEx(NULL, "Window Class", "Mouse coords", WS_OVERLAPPEDWINDOW, 200, 200, 640, 480, NULL, NULL, hInst, NULL);
if(!hWnd)
{
int nResult=GetLastError();
MessageBox(NULL,
"Window creation failedrn",
"Window Creation Failed",
MB_ICONERROR);
}
ShowWindow(hWnd,nShowCmd);
MSG msg;
ZeroMemory(&msg,sizeof(MSG));
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
char buffer[32];
POINT mouse;
switch(msg)
{
case WM_CREATE:
{
// Create an edit box
hEdit=CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD|WS_VISIBLE| ES_MULTILINE|ES_AUTOVSCROLL|ES_AUTOHSCROLL, 50, 100, 200, 100, hWnd, (HMENU)IDC_MAIN_EDIT, GetModuleHandle(NULL), NULL);
HGDIOBJ hfDefault=GetStockObject(DEFAULT_GUI_FONT);
SendMessage(hEdit, WM_SETFONT, (WPARAM)hfDefault, MAKELPARAM(FALSE,0));
SendMessage(hEdit, WM_SETTEXT, NULL, (LPARAM)"Insert text here...");
// Create a push button
HWND hWndButton=CreateWindowEx(NULL, "BUTTON", "OK", WS_TABSTOP|WS_VISIBLE| WS_CHILD|BS_DEFPUSHBUTTON, 50, 220, 100, 24, hWnd, (HMENU)IDC_MAIN_BUTTON, GetModuleHandle(NULL), NULL);
SendMessage(hWndButton, WM_SETFONT, (WPARAM)hfDefault, MAKELPARAM(FALSE,0));
}
break;
case WM_LBUTTONDOWN:
{
mouse.x = LOWORD(lParam);
mouse.y = HIWORD(lParam);
ScreenToClient(hWnd, &mouse);
sprintf(buffer,"Mouse coords: %dx%d",mouse.x,mouse.y);
MessageBox(NULL, buffer, "Information", MB_ICONINFORMATION);
}
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_MAIN_BUTTON:
{
mouse.x = LOWORD(lParam);
mouse.y = HIWORD(lParam);
ScreenToClient(hWnd, &mouse);
SendMessage(hEdit, WM_GETTEXT, sizeof(buffer)/sizeof(buffer[0]), reinterpret_cast<LPARAM>(buffer));
sprintf(buffer,"Mouse coords: %dx%d",mouse.x,mouse.y);
MessageBox(NULL, buffer, "Mouse coords", MB_ICONINFORMATION);
}
break;
}
break;
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
break;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}
相关文章:
- netcat command in c++
- WinAPI挂钩鼠标
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 将鼠标悬停在问题上时与预期">"相关的代码错误
- 跟踪滚动条上的鼠标事件
- SendInput()鼠标移动计算
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- 如何在鼠标挂钩过程中检测拖动
- Win32 发送输入鼠标移动滞后并冻结
- 将鼠标和键盘输入发送到 unity3d 游戏 (Rust)
- Poloniex API "Invalid command" c++ libcurl
- 有没有办法区分Qt小部件是通过鼠标单击还是通过按表键获得焦点?
- 在 macOS 中使用 C/C++ 设置鼠标光标图像
- 如何通过拖动鼠标QT检查按钮?鼠标移动事件
- SDL2 调整窗口大小后如何缩放鼠标坐标?
- 如何在QSplashScreen中禁用鼠标单击
- C++鼠标单击时的屏幕截图不起作用
- 如何将鼠标坐标转换为"mm"
- 标签检测鼠标单击 c++
- 使用 SFML 在矩形的矢量中查找鼠标单击量