2012-09-08 2 views
0

가능한 중복 :
Get Current Cursor PositionWM_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를 상대적으로 DialogWindow로 가져 오는 방법을 파악하지 못합니까? 도움 주셔서 감사합니다.

답변

1

받은 메시지는 pt라는 POINT 구조를 포함하고 있습니다. 적어도 마우스로 시작된 메시지의 경우 메시지의 시점에서 마우스의 위치입니다. 화면 좌표이므로 대화 상자를 기준으로 좌표를 가져 오려면 ScreenToClient 또는 (선호) MapWindowPoints을 사용해야합니다.

0

이 코드를 사용해 뭔가 알아낼 수 있는지 확인하십시오.

#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); 
} 
관련 문제