C++ 如何在WM_命令中检索鼠标位置
可能重复:C++ 如何在WM_命令中检索鼠标位置,c++,winapi,C++,Winapi,可能重复: 我创建如下按钮: 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窗口? 谢谢你的帮助?试
我创建如下按钮:
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窗口?
谢谢你的帮助?试试这段代码,看看你是否能想出什么办法
#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 failed\r\n", "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 failed\r\n",
"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);
}
#包括
#包括
#定义IDC_主按钮101//按钮标识符
#定义IDC\u MAIN\u EDIT 102//编辑框标识符
HWND-hEdit;
LRESULT回调WinProc(HWND-HWND,UINT消息,WPARAM-WPARAM,LPARAM-LPARAM);
int-WINAPI WinMain(HINSTANCE-hInst、HINSTANCE-hPrevInst、LPSTR-lpCmdLine、int-nShowCmd)
{
WNDCLASSEX WCLASSE;
零内存(&wClass,sizeof(WNDCLASSEX));
wClass.cbClsExtra=NULL;
wClass.cbSize=sizeof(WNDCLASSEX);
wClass.cbWndExtra=NULL;
wClass.hbrBackground=(HBRUSH)彩色窗口;
wClass.hCursor=LoadCursor(空,IDC_箭头);
wClass.hIcon=NULL;
wClass.hIconSm=NULL;
wClass.hInstance=hInst;
lpfnWndProc=(WNDPROC)WinProc;
wClass.lpszClassName=“窗口类”;
wClass.lpszMenuName=NULL;
wClass.style=CS|HREDRAW | CS|VREDRAW;
如果(!RegisterClass(&wClass))
{
int nResult=GetLastError();
MessageBox(NULL,“窗口类创建失败\r\n”,“窗口类失败”,MB\U ICONERROR);
}
HWND HWND=CreateWindowEx(NULL,“窗口类”,“鼠标坐标”,WS_重叠窗口,200200640480,NULL,NULL,hInst,NULL);
如果(!hWnd)
{
int nResult=GetLastError();
MessageBox(空,
“窗口创建失败\r\n”,
“窗口创建失败”,
MB_(错误);
}
显示窗口(hWnd、nShowCmd);
味精;
零内存(&msg,sizeof(msg));
while(GetMessage(&msg,NULL,0,0))
{
翻译信息(&msg);
发送消息(&msg);
}
返回0;
}
LRESULT回调WinProc(HWND HWND,UINT msg,WPARAM WPARAM,LPARAM LPARAM)
{
字符缓冲区[32];
点鼠标;
开关(msg)
{
案例WM_创建:
{
//创建编辑框
hEdit=CreateWindowEx(WS_EX_CLIENTEDGE,“EDIT”,WS_CHILD,WS_VISIBLE,ES_MULTILINE,ES_AUTOVSCROLL,ES_AUTOHSCROLL,50100200100,hWnd,(humenu)IDC_MAIN_EDIT,GetModuleHandle(NULL),NULL);
HGDIOBJ hfDefault=GetStockObject(默认图形用户界面字体);
SendMessage(hEdit,WM_SETFONT,(WPARAM)hfDefault,MAKELPARAM(FALSE,0));
SendMessage(hEdit,WM_SETTEXT,NULL,(LPARAM)“在此处插入文本…”);
//创建一个按钮
HWND hWndButton=CreateWindowEx(空,“按钮”,“确定”,WS|TABSTOP | WS|u可见| WS|u CHILD | BS|u def按钮,50、220、100、24、HWND,(HMENU)IDC_主按钮,GetModuleHandle(空),空);
SendMessage(hWndButton,WM_SETFONT,(WPARAM)hfDefault,MAKELPARAM(FALSE,0));
}
打破
案例WM_LBUTTONDOWN:
{
mouse.x=LOWORD(lParam);
mouse.y=HIWORD(lParam);
屏幕客户端(hWnd和鼠标);
sprintf(缓冲区,“鼠标坐标:%dx%d”,Mouse.x,Mouse.y);
MessageBox(空,缓冲区,“信息”,MB_图标信息);
}
打破
case WM_命令:
开关(LOWORD(wParam))
{
机箱IDC_主按钮:
{
mouse.x=LOWORD(lParam);
mouse.y=HIWORD(lParam);
屏幕客户端(hWnd和鼠标);
SendMessage(hEdit,WM_GETTEXT,sizeof(buffer)/sizeof(buffer[0]),reinterpret_cast(buffer));
sprintf(缓冲区,“鼠标坐标:%dx%d”,Mouse.x,Mouse.y);
MessageBox(空,缓冲区,“鼠标坐标”,MB_图标信息);
}
打破
}
打破
案例WM_销毁:
{
PostQuitMessage(0);
返回0;
}
打破
}
返回DefWindowProc(hWnd、msg、wParam、lParam);
}
您收到的消息包含一个名为pt
的结构。至少对于任何源于鼠标的消息,这是消息发出时鼠标的位置。这是屏幕坐标,因此您需要使用ScreenToClient
或(最好)获取与对话框相关的坐标