2011-02-03 17 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文の前にコードを移動します。 –

+0

どうすればお勧めしますか? –

+0

あなたはMOUSEMOVEウィンドウのメッセージを手渡してカーソル位置を取得したいと思うかもしれませんし、あなたが現在持っている 'char *'の 'wchar_t *'へのキャストに対処する必要があります〜に)。 –

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の意味は同じですが、座標はウィンドウのクライアント領域を基準にしています。

関連する問題