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: 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: 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: #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;
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; } 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: 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 |
|
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. |
|
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: LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { HDC hdc = GetDC( hwnd ); switch( msg ) { case WM_COMMAND: 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: { 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: #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;
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); void GetDesktopResolution( int & horizontal, int & vertical ) { RECT desktop; const HWND hDesktop = GetDesktopWindow(); GetWindowRect( hDesktop, & desktop ); 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; } 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: 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: { 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 ); } }
|
|
DejaVu |
» 2013-06-05 22:00:10 Jeden temat = jeden problem. Zamykam. |
|
« 1 » |