2011-02-03 1 views
0

J'ai créé une application win32 en visual-C++ mais cette programmation n'imprimant pas la souris coordonne tous les autres événements fonctionnant correctement quelqu'un peut-il me dire comment obtenir les coordonnées de la souris dans l'application visual-C++ win32?coordonnées de la souris dans l'application visual-C++ win32?

en espérant une réponse rapide et positive.

// 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

Avec le code affiché, vous n'atteindrez jamais le code qui imprime la position de la souris. Vous cassez avant, toujours. En outre, la conversion d'un tampon de caractères en tampon de caractères larges ne fonctionnera pas non plus. Vous devez toujours utiliser des caractères larges ou remplacer votre code actuel pour utiliser TCHAR. –

+0

pouvez-vous me dire comment obtenir les coordonnées de la souris alors? –

Répondre

2

Comme je l'ai mentionné dans le commentaire, le bloc de code suivant 1) ne sera jamais atteint, et 2) même si vous ne fonctionnera pas le rendre accessible:

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

je déplace le code avant la déclaration de commutateur c'est ok alors ?? –

+0

comment cela va fonctionner s'il vous plaît suggérer? –

+0

Vous aurez probablement envie de passer le message de la fenêtre MOUSEMOVE et d'obtenir la position du curseur ... et vous devrez toujours adresser la conversion de 'char *' en 'wchar_t *' que vous avez actuellement (et ne fonctionnera pas comme prévu à). –

1

Utilisez GetCursorInfo() pour obtenir le emplacement de la souris à tout moment. Si vous souhaitez effectuer le suivi uniquement lorsque la souris se déplace, saisissez WM_MOUSEMOVE.

See this précédente question/réponse pour plus d'informations.

Et comme d'autres l'ont dit, vous devrez résoudre vos problèmes Unicode/char * avec vos chaînes.

2

Spécifiquement dans le message WM_MOUSEWHEEL, les coordonnées du curseur sont transmises dans lParam. LOWORD(lParam) serait x, HIWORD(lParam) serait y. Les coordonnées sont relatives à l'écran, pas à votre fenêtre. Utilisez ScreenToClient() pour convertir. La signification de lParam dans WM_xBUTTONDOWN/UP et WM_MOUSEMOVE est la même, mais les coordonnées sont relatives à la zone client de votre fenêtre.

Questions connexes