2011-02-03 7 views
0

Visual C++에서 win32 응용 프로그램을 만들었지 만,이 프로그래밍은 마우스를 인쇄하지 않으면 다른 모든 이벤트가 올바르게 작동합니다. Visual C++ win32 응용 프로그램에서 마우스 좌표를 가져 오는 방법을 말해 줄 수 있습니까?입니까?

신속하고 긍정적 인 반응을 기대합니다. 내가 코멘트에서 언급 한 바와 같이

// ttt.cpp : Defines the entry point for the application. 
// TO Demonstrate the Mouse Events 

#include "windows.h" 
#include "stdafx.h" 
#include "stdio.h" 


LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    int x,y; 
    LPCWSTR msgdown = (LPCWSTR)L"Left Mouse Button Down" ; 
    LPCWSTR msgup = (LPCWSTR)L"Left Mouse Button UP" ; 
    LPCWSTR msgdblclk = (LPCWSTR)L"Left Mouse Button Dbl clk" ; 

    LPCWSTR rmsgdown = (LPCWSTR)L"Right Mouse Button Down" ; 
    LPCWSTR rmsgup = (LPCWSTR)L"Right Mouse Button UP" ; 
    LPCWSTR rmsgdblclk = (LPCWSTR)L"Right Mouse Button Dbl clk" ; 

    LPCWSTR rwheel = (LPCWSTR)L"Mousescroll" ; 
    //LPCWSTR txtmsg = (LPCWSTR)L"position" ; 
    LPCWSTR mouse = (LPCWSTR)L"Mouse" ; 
    switch (msg) 
    { 
     case WM_CLOSE: 
     DestroyWindow(hWnd); 
     break; 

     case WM_DESTROY: 
     PostQuitMessage(0); 
     break; 

     case WM_LBUTTONDOWN: 
     MessageBox(hWnd,msgdown,mouse,MB_OK); 

     break; 

     case WM_LBUTTONUP: 
      MessageBox(hWnd,msgup,mouse,MB_OK); 
     break; 

     case WM_LBUTTONDBLCLK: 
     MessageBox(hWnd,msgdblclk,mouse,MB_OK); 
     break;  

     case WM_RBUTTONUP: 
     MessageBox(hWnd,rmsgup,mouse,MB_OK); 
     break; 

     case WM_RBUTTONDOWN: 
     MessageBox(hWnd,rmsgdown,mouse,MB_OK); 
     break; 

     case WM_RBUTTONDBLCLK: 
     MessageBox(hWnd,rmsgdblclk,mouse,MB_OK); 
     break; 

     case WM_MOUSEWHEEL: 
     MessageBox(hWnd,rwheel,mouse,MB_OK); 
     break; 


     char text[50]; 
     POINT p; 
     sprintf(text,"Mouse Position: X=%d, Y=%d",p.x,p.y); 
     LPCWSTR textmsg = (LPCWSTR)text; 
     SetWindowText(hWnd,textmsg); 
     break; 


     /*POINT pt; 
     GetCursorPos(&pt); 

     int a = (int)pt.x; 
     int b = (int)pt.y;*/ 
    } 
     return DefWindowProc(hWnd, msg, wParam, lParam); 
} 

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) 
{ 
    LPCTSTR className=(LPCTSTR)"Mouse Test"; 
    WNDCLASSEX wc; 

    wc.cbSize =sizeof(WNDCLASSEX); 
    wc.style =CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; 
    wc.lpfnWndProc =WndProc; 
    wc.cbClsExtra =0; 
    wc.cbWndExtra = 0; 
    wc.hInstance = hInstance; 
    wc.hIcon = LoadIcon(NULL,IDI_WINLOGO); 
    wc.hCursor = LoadCursor(NULL,IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW +1); 
    wc.lpszMenuName = NULL; 
    wc.lpszClassName = className; 
    wc.hIconSm = LoadIcon(NULL,IDI_WINLOGO); 

    MessageBoxA(NULL,"mouse events","mouse",MB_OK); 



    if(!RegisterClassEx(&wc)) 
    { 
     MessageBox(NULL,(LPCWSTR)"Error Registering Class",(LPCWSTR)"Error RegisterClassEx",MB_OK | MB_ICONERROR); 
     return 1; 
    } 

    HWND hwmd = CreateWindowEx(0,className,(LPCWSTR)L"Mouse Test",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,400,300,NULL,NULL,hInstance,NULL); 
    ShowWindow(hwmd,SW_SHOWDEFAULT); 
    UpdateWindow(hwmd); 


    if(!hwmd) 
    { 
     MessageBox(NULL,(LPCWSTR)"Error Creating Window",(LPCWSTR)"Error CreateWindowEx",MB_OK | MB_ICONERROR); 
     return 1; 
    } 

     MSG msg; 

    while(GetMessage(&msg,NULL,0,0)>0) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

    return (int)msg.wParam; 
} 
+0

게시 된 코드를 사용하면 마우스 위치를 인쇄하는 코드에 결코 도달 할 수 없습니다. 항상 그 앞에 부셔. 또한 문자 버퍼를 와이드 문자 버퍼로 캐스팅하는 것도 작동하지 않습니다. 항상 와이드 문자를 사용해야하거나 TCHAR을 사용하기 위해 현재 코드를 바꿀 필요가 있습니다. –

+0

그러면 마우스 좌표를 얻는 방법을 알려주실 수 있습니까? –

답변

2

다음 코드 블록은 1)에 도달하지 않을 것이며, 2) 당신이 도달 할 경우에도 작동하지 않습니다

case WM_MOUSEWHEEL: 
     MessageBox(hWnd,rwheel,mouse,MB_OK); 
     break; 


     char text[50]; // no case to get you here! 
     POINT p; 
     sprintf(text,"Mouse Position: X=%d, Y=%d",p.x,p.y); 
     LPCWSTR textmsg = (LPCWSTR)text; // will not work! 
     SetWindowText(hWnd,textmsg); 
     break; 
+0

switch 문 앞에 코드를 옮기면 ok입니다. ?? –

+0

어떻게 작동할까요? –

+0

당신은 MOUSEMOVE 윈도우 메시지를 건네주고 커서 위치를 얻고 싶을 것이다 ... 그리고 당신은 여전히 ​​당신이 현재 가지고있는'char *'의 캐스팅을'wchar_t *'로 처리해야한다. 그것). –

1

사용 GetCursorInfo()이를 얻을 어떤 시점에서 마우스의 위치. 마우스가 실제로 움직일 때만 추적하려면 WM_MOUSEMOVE을 처리하십시오.

See this 자세한 내용은 이전 질문/답변을 참조하십시오.

다른 사람들이 말했듯이, 문자열로 유니 코드/char * 문제를 해결해야합니다.

2

특히 WM_MOUSEWHEEL 메시지에서 커서 좌표는 lParam에 전달됩니다. LOWORD(lParam)이 x 일 때 HIWORD(lParam)이 y가됩니다. 좌표는 화면이 아니라 화면과 관련이 있습니다. ScreenToClient()를 사용하여 변환하십시오.

WM_xBUTTONDOWN/UP 및 WM_MOUSEMOVE의 lParam의 의미는 동일하지만 좌표는 창의 클라이언트 영역을 기준으로합니다.