Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinAPI] Odczytywanie pozycji myszy

Ostatnio zmodyfikowano 2013-06-05 22:00
Autor Wiadomość
Caranti
Temat założony przez niniejszego użytkownika
[WinAPI] Odczytywanie pozycji myszy
» 2013-06-01 20:18:55
Mam problem z odczytywaniem pozycji myszy funkcja GetCursorPos(&pozycja)

Funkcja WndProc:

C/C++
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    HDC hdc = GetDC( hwnd );
    POINT wspolzedna;
    int x, x1, y, y1;
   
    switch( msg )
    {
       
    case WM_COMMAND: //Nacisniecie jakiegokolwiek przycisku
        switch( wParam )
        {
        case ID_PRZYCISK1:
            MessageBox( hwnd, "Przycisk_C", "Error", MB_OK );
            break;
           
        case ID_PRZYCISK2:
            MessageBox( hwnd, "Przycisk B", "<< removed >>", MB_OK );
            break;
        }
        break;
       
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
       
    case WM_LBUTTONDOWN:
        {
            GetCursorPos( & wspolzedna );
            x = wspolzedna.x;
            y = wspolzedna.y;
            Przyc = true;
        }
        break;
       
    case WM_LBUTTONUP:
        {
            GetCursorPos( & wspolzedna );
            x1 = wspolzedna.x;
            y1 = wspolzedna.y;
            Zwolnienie = true;
           
            if( Przyc && Zwolnienie )
            {
                StaryKursor = SetCursor( LoadCursor( NULL, IDC_WAIT ) );
                Rectangle( hdc, x, y, x1, y1 );
                Przyc = false;
                Zwolnienie = false;
            }
        }
        break;
       
    case WM_MOUSEMOVE:
       
        break;
       
    default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
}

Cały Kod:
C/C++
#include <Windows.h>


MSG komunikat;
LPSTR NazwaKlasy = "Klasa Okienka";
bool Przyc = false;
bool Zwolnienie = false;
HCURSOR StaryKursor;
#define ID_PRZYCISK1 501
#define ID_PRZYCISK2 502

HWND mainwin, Przycisk_B, Przycisk_C;
//-------------------------------FUNCTIONS-----------------------------------
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
//---------------------------------------------------------------------------
int WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    WNDCLASSEX winclass;
   
   
    winclass.cbSize = sizeof( WNDCLASSEX );
    winclass.style = CS_DBLCLKS;
    winclass.lpfnWndProc = WndProc;
    winclass.cbClsExtra = 0;
    winclass.cbWndExtra = 0;
    winclass.hInstance = hInstance;
    winclass.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    winclass.hCursor = LoadCursor( NULL, IDC_ARROW );
    winclass.hbrBackground =( HBRUSH )( COLOR_WINDOW + 0 );
    winclass.lpszMenuName = NULL;
    winclass.lpszClassName = NazwaKlasy;
    winclass.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
    if( !RegisterClassEx( & winclass ) )
    {
        MessageBox( NULL, "Wysoka Komisja ma nas w << removed >>", "BRAK POZWOLENIA", MB_OK );
        return 1;
    }
    //------------------------------ CREATE WINDOWS ----------------------------
    mainwin = CreateWindowEx( WS_EX_WINDOWEDGE, NazwaKlasy, "TEST", WS_BORDER,
    426, 341, 1024, 768, NULL, NULL, hInstance, NULL );
   
    Przycisk_B = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "Przycisk_B",
    WS_CHILD | WS_VISIBLE, 334, 462, 100, 100, mainwin,( HMENU ) ID_PRZYCISK2, hInstance, NULL );
   
    Przycisk_C = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "C", WS_CHILD | WS_VISIBLE, 334, 100, 100, 20, mainwin,
    ( HMENU ) ID_PRZYCISK1, hInstance, NULL );
   
   
    if( mainwin == NULL )
    {
        MessageBox( NULL, "OKNO ODMOWILA POSLUSZENSTWA", "ALE KICHA", MB_ICONEXCLAMATION );
        return 1;
    }
   
    ShowWindow( mainwin, nCmdShow );
    UpdateWindow( mainwin );
   
    while( GetMessage( & komunikat, NULL, 0, 0 ) )
    {
        TranslateMessage( & komunikat );
        DispatchMessage( & komunikat );
    }
    return komunikat.wParam;
   
}
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    HDC hdc = GetDC( hwnd );
    POINT wspolzedna;
    int x, x1, y, y1;
   
    switch( msg )
    {
       
    case WM_COMMAND: //Nacisniecie jakiegokolwiek przycisku
        switch( wParam )
        {
        case ID_PRZYCISK1:
            MessageBox( hwnd, "Przycisk_C", "Error", MB_OK );
            break;
           
        case ID_PRZYCISK2:
            MessageBox( hwnd, "Przycisk B", "<< removed >>", MB_OK );
            break;
        }
        break;
       
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
       
    case WM_LBUTTONDOWN:
        {
            GetCursorPos( & wspolzedna );
            x = wspolzedna.x;
            y = wspolzedna.y;
            Przyc = true;
        }
        break;
       
    case WM_LBUTTONUP:
        {
            GetCursorPos( & wspolzedna );
            x1 = wspolzedna.x;
            y1 = wspolzedna.y;
            Zwolnienie = true;
           
            if( Przyc && Zwolnienie )
            {
                StaryKursor = SetCursor( LoadCursor( NULL, IDC_WAIT ) );
                Rectangle( hdc, x, y, x1, y1 );
                Przyc = false;
                Zwolnienie = false;
            }
        }
        break;
       
    case WM_MOUSEMOVE:
       
        break;
       
    default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
}

Zmienna x,y nie są inicjalizowane ;/ dziwne
P-84573
Monika90
» 2013-06-01 20:44:33
Są to zmienne automatyczne, które są tworzone na nowo za każdym razem gdy odebrany jest jakiś komunikat.
P-84577
Caranti
Temat założony przez niniejszego użytkownika
» 2013-06-02 15:06:31
Dzięki podziałało, mam natomiast pytanie, czy istnieje możliwość rysowania jakiejkolwiek figury w taki sposób jak w Paint - cie , mam na myśli aby nie doszło do Braku Pamięci ponieważ funkcja rysująca jest cały czas wywoływana   ->wzrasta ilość wykorzystywanej pamięci. Coś co by niszczyło stare obiekty natomiast pozostawiło Rysunek zatwierdzający (w momencie LeftButtonUp )

FUNKCJA WNDPROC:
C/C++
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    HDC hdc = GetDC( hwnd );
   
    switch( msg )
    {
       
    case WM_COMMAND: //Nacisniecie jakiegokolwiek przycisku
        switch( wParam )
        {
        case ID_PRZYCISK1:
            MessageBox( hwnd, "Przycisk_B", "Error", MB_OK );
            Obramowanie = CreatePen( PS_SOLID, 4, 0x0000FF );
            KolorTla = CreateSolidBrush( 0x00FF00 );
            break;
           
        case ID_PRZYCISK2:
            MessageBox( hwnd, "Przycisk C", "<< removed >>", MB_OK );
            Obramowanie = CreatePen( PS_SOLID, 1, 0xFF0000 );
            KolorTla = CreateSolidBrush( 0x00FF );
            break;
        }
        break;
       
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
       
    case WM_LBUTTONDOWN:
        {
            GetCursorPos( & stara );
            Przyc = true;
        }
        break;
       
    case WM_LBUTTONUP:
        {
            //GetCursorPos( & wspolzedna );
            //x = wspolzedna.x;
            //y = wspolzedna.y;
            Przyc = false;
        }
        break;
       
    case WM_MOUSEMOVE:
        {
            GetCursorPos( & nowa );
            if( Przyc )
            {
                SelectObject( hdc, KolorTla );
                SelectObject( hdc, Obramowanie );
                Rectangle( hdc, stara.x, stara.y, nowa.x, nowa.y );
                ReleaseDC( hwnd, hdc );
            }
        }
        break;
       
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
}
CAŁY KOD:
C/C++
#include <Windows.h>
#include "wtypes.h"

MSG komunikat;
LPSTR NazwaKlasy = "Klasa Okienka";
bool Przyc = false;
bool Zwolnienie = false;
HCURSOR StaryKursor;
#define ID_PRZYCISK1 501
#define ID_PRZYCISK2 502
POINT stara, nowa;
HPEN Obramowanie = CreatePen( PS_SOLID, 5, 0x0000FF );
HBRUSH KolorTla = CreateSolidBrush( 0x00FF00 );

HWND mainwin, Przycisk_B, Przycisk_C;
//-------------------------------FUNCTIONS-----------------------------------
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
void GetDesktopResolution( int & horizontal, int & vertical )
{
    RECT desktop;
    // Get a handle to the desktop window
    const HWND hDesktop = GetDesktopWindow();
    // Get the size of screen to the variable desktop
    GetWindowRect( hDesktop, & desktop );
    // The top left corner will have coordinates (0,0)
    // and the bottom right corner will have coordinates
    // (horizontal, vertical)
    horizontal = desktop.right;
    vertical = desktop.bottom;
}
//---------------------------------------------------------------------------
int WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
   
    int horizontal = 100, vertical = 100;
    GetDesktopResolution( horizontal, vertical );
    WNDCLASSEX winclass;
   
    winclass.cbSize = sizeof( WNDCLASSEX );
    winclass.style = CS_DBLCLKS;
    winclass.lpfnWndProc = WndProc;
    winclass.cbClsExtra = 0;
    winclass.cbWndExtra = 0;
    winclass.hInstance = hInstance;
    winclass.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    winclass.hCursor = LoadCursor( NULL, IDC_ARROW );
    winclass.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    winclass.lpszMenuName = NULL;
    winclass.lpszClassName = NazwaKlasy;
    winclass.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
    if( !RegisterClassEx( & winclass ) )
    {
        MessageBox( NULL, "Wysoka Komisja ma nas w << removed >>", "BRAK POZWOLENIA", MB_OK );
        return 1;
    }
    //------------------------------ CREATE WINDOWS ----------------------------
    mainwin = CreateWindowEx( WS_EX_WINDOWEDGE, NazwaKlasy, "TEST", WS_BORDER,
    CW_USEDEFAULT, CW_USEDEFAULT, horizontal, vertical, NULL, NULL, hInstance, NULL );
   
    Przycisk_B = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "Przycisk_B",
    WS_CHILD | WS_VISIBLE, 334, 462, 100, 100, mainwin,( HMENU ) ID_PRZYCISK2, hInstance, NULL );
   
    Przycisk_C = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "C", WS_CHILD | WS_VISIBLE, 334, 100, 100, 20, mainwin,
    ( HMENU ) ID_PRZYCISK1, hInstance, NULL );
   
   
    if( mainwin == NULL )
    {
        MessageBox( NULL, "OKNO ODMOWILA POSLUSZENSTWA", "ALE KICHA", MB_ICONEXCLAMATION );
        return 1;
    }
   
    ShowWindow( mainwin, nCmdShow );
    UpdateWindow( mainwin );
   
    while( GetMessage( & komunikat, NULL, 0, 0 ) )
    {
        TranslateMessage( & komunikat );
        DispatchMessage( & komunikat );
    }
    return komunikat.wParam;
   
}
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    HDC hdc = GetDC( hwnd );
   
    switch( msg )
    {
       
    case WM_COMMAND: //Nacisniecie jakiegokolwiek przycisku
        switch( wParam )
        {
        case ID_PRZYCISK1:
            MessageBox( hwnd, "Przycisk_B", "Error", MB_OK );
            Obramowanie = CreatePen( PS_SOLID, 4, 0x0000FF );
            KolorTla = CreateSolidBrush( 0x00FF00 );
            break;
           
        case ID_PRZYCISK2:
            MessageBox( hwnd, "Przycisk C", "<< removed >>", MB_OK );
            Obramowanie = CreatePen( PS_SOLID, 1, 0xFF0000 );
            KolorTla = CreateSolidBrush( 0x00FF );
            break;
        }
        break;
       
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
       
    case WM_LBUTTONDOWN:
        {
            GetCursorPos( & stara );
            Przyc = true;
        }
        break;
       
    case WM_LBUTTONUP:
        {
            //GetCursorPos( & wspolzedna );
            //x = wspolzedna.x;
            //y = wspolzedna.y;
            Przyc = false;
        }
        break;
       
    case WM_MOUSEMOVE:
        {
            GetCursorPos( & nowa );
            if( Przyc )
            {
                SelectObject( hdc, KolorTla );
                SelectObject( hdc, Obramowanie );
                Rectangle( hdc, stara.x, stara.y, nowa.x, nowa.y );
                ReleaseDC( hwnd, hdc );
            }
        }
        break;
       
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
}
P-84654
DejaVu
» 2013-06-05 22:00:10
Jeden temat = jeden problem. Zamykam.
P-85006
« 1 »
  Strona 1 z 1