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
或(最好)获取与对话框相关的坐标