2011-02-03 15 views
0

我已經在visual-C++中創建了一個win32應用程序,但是這個程序不打印鼠標座標,所有其他事件都可以正常工作,任何人都可以告訴我如何在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。 – 2011-02-03 13:57:48

+0

你能告訴我如何獲得鼠標座標嗎? – 2011-02-03 13:59:09

回答

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; 
1

使用GetCursorInfo()得到鼠標在任何時間點的位置。如果只想在鼠標實際移動時進行跟蹤,請處理WM_MOUSEMOVE

See this上一個問題/回答獲取更多信息。

正如其他人所說,你需要修復你的Unicode/char *問題與你的字符串。

2

特別是在WM_MOUSEWHEEL消息中,光標座標以lParam傳遞。 LOWORD(lParam)將是x,HIWORD(lParam)將是y。座標是相對於屏幕而不是你的窗口。使用ScreenToClient()進行轉換。

WM_xBUTTONDOWN/UP和WM_MOUSEMOVE中lParam的含義是相同的,但座標是相對於您的窗口的客戶區。