Ĺadny brzuch
Mam taki kod:
#include <windows.h> #include <stdio.h> LRESULT CALLBACK ProcOkna(HWND, UINT, WPARAM, LPARAM); char szNazwaOkna[] = "Moje okno"; char napis[255]; HBITMAP hBit1, hBit2; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArgs, int nWinMode) { HWND hwnd; MSG msg; WNDCLASSEX wc; wc.hInstance = hInstance; wc.lpszClassName = szNazwaOkna; wc.lpfnWndProc = ProcOkna; wc.style = CS_HREDRAW | CS_VREDRAW; wc.cbSize = sizeof(WNDCLASSEX); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // duża ikona wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // mała ikona wc.hCursor = LoadCursor(NULL,IDC_ARROW); // styl kursora wc.lpszMenuName = NULL; // brak menu wc.cbClsExtra=0; wc.cbWndExtra=0; wc.hbrBackground = (HBRUSH) GetStockObject(1); // tło na biało // rejestracja klasy okna if (!RegisterClassEx(&wc)) { MessageBox(NULL, "Nieudana rejestracja klasy okna","Błąd",MB_OK|MB_ICONEXCLAMATION); return 0; } hwnd = CreateWindow( szNazwaOkna, // nazwa okna "LOL", // tytuł WS_OVERLAPPEDWINDOW, // styl - normalny CW_USEDEFAULT, // początkowe x CW_USEDEFAULT, // początkowe y CW_USEDEFAULT, // szerokość CW_USEDEFAULT, // wysokość HWND_DESKTOP, // brak okien-rodziców NULL, // brak menu hInstance, // uchwyt instancji NULL // brak dodat. argumentów ); hBit1 = LoadBitmap(hInstance,"FLAGA"); hBit2 = LoadBitmap(hInstance,"KOLKO"); ShowWindow(hwnd, nWinMode); // wyświetlenie okna UpdateWindow(hwnd); // pętla komunikatów while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK ProcOkna(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; HDC memDC; PAINTSTRUCT ps; switch(message) { case WM_KEYDOWN: switch (wParam) { case VK_ESCAPE: break; case VK_SPACE: break; case VK_RETURN: break; } break; case WM_PAINT: hdc = BeginPaint(hwnd,&ps); memDC = CreateCompatibleDC(hdc); SelectObject(memDC, hBit1); BitBlt(hdc, 0, 0, 128, 128, memDC, 0,0,SRCCOPY); SelectObject(memDC, hBit2); BitBlt(hdc, 128, 0, 128, 128, memDC, 0,0,SRCCOPY); EndPaint(hwnd,&ps); DeleteDC(memDC); break; case WM_DESTROY: DeleteObject(hBit1); DeleteObject(hBit2); PostQuitMessage(0); break; default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; }
Jak uzupełnić obsługę klawiatury aby np. po naciśnięciu prawego kursora bitmapa poruszała się w prawo po ekranie?
Nie zglebialem dokladnie calosci, ale pozycje obrazka musisz ustalac za pomkoca zmiennych, ktore bedziesz modyfikowal po nacisnieciu klawisza.
A nacisniecie klawisza wylapujesz w case WM_KEYDOWN.
Identyfikatory klawiszy masz w pomocy.
Strzalka w lewo to bodajze VK_LEFT a w prawo to VK_RIGHT. Wylapujesz je tak samo jak escape czy enter.
O to chodzilo? <_<
Nie zglebialem dokladnie calosci, ale pozycje obrazka musisz ustalac za pomkoca zmiennych, ktore bedziesz modyfikowal po nacisnieciu klawisza.
A nacisniecie klawisza wylapujesz w case WM_KEYDOWN.
Identyfikatory klawiszy masz w pomocy.
Strzalka w lewo to bodajze VK_LEFT a w prawo to VK_RIGHT. Wylapujesz je tak samo jak escape czy enter.
O to chodzilo? <_<
musisz zapisać sobie współrzędne bitmapy w zmiennych (strukturze), zmieniać je przy naciśnięciu klawiszy i użyć tych zmiennych w WM_PAINT.
Czyli mniej więcej tak:
(...) POINT pWsp = {0,0}; (...) switch(message) { case WM_KEYDOWN: switch (wParam) { case VK_LEFT: if(pWsp.x > 1) pWsp.x-=1; break; case VK_RIGHT: if(pWsp.x < 800) pWsp.x += 1; break; (...) SelectObject(memDC, hBit1); BitBlt(hdc, pWsp.x, pWsp.y, 128, 128, memDC, 0,0,SRCCOPY); (...)
Użytkownik bartolomeo4 edytował ten post 18 czerwiec 2006, 11:27
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
#include <windows.h> #include <stdio.h> LRESULT CALLBACK ProcOkna(HWND, UINT, WPARAM, LPARAM); char szNazwaOkna[] = "Moje okno"; char napis[255]; HBITMAP hBit1, hBit2; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArgs, int nWinMode) { HWND hwnd; MSG msg; WNDCLASSEX wc; wc.hInstance = hInstance; wc.lpszClassName = szNazwaOkna; wc.lpfnWndProc = ProcOkna; wc.style = CS_HREDRAW | CS_VREDRAW; wc.cbSize = sizeof(WNDCLASSEX); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // duża ikona wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // mała ikona wc.hCursor = LoadCursor(NULL,IDC_ARROW); // styl kursora wc.lpszMenuName = NULL; // brak menu wc.cbClsExtra=0; wc.cbWndExtra=0; wc.hbrBackground = (HBRUSH) GetStockObject(1); // tło na biało // rejestracja klasy okna if (!RegisterClassEx(&wc)) { MessageBox(NULL, "Nieudana rejestracja klasy okna","Błąd",MB_OK|MB_ICONEXCLAMATION); return 0; } hwnd = CreateWindow( szNazwaOkna, // nazwa okna "LOL", // tytuł WS_OVERLAPPEDWINDOW, // styl - normalny CW_USEDEFAULT, // początkowe x CW_USEDEFAULT, // początkowe y CW_USEDEFAULT, // szerokość CW_USEDEFAULT, // wysokość HWND_DESKTOP, // brak okien-rodziców NULL, // brak menu hInstance, // uchwyt instancji NULL // brak dodat. argumentów ); hBit1 = LoadBitmap(hInstance,"FLAGA"); hBit2 = LoadBitmap(hInstance,"KOLKO"); ShowWindow(hwnd, nWinMode); // wyświetlenie okna UpdateWindow(hwnd); // pętla komunikatów while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK ProcOkna(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; HDC memDC; PAINTSTRUCT ps; switch(message) { case WM_KEYDOWN: switch (wParam) { case VK_ESCAPE: break; case VK_SPACE: break; case VK_RETURN: break; } break; case WM_PAINT: hdc = BeginPaint(hwnd,&ps); memDC = CreateCompatibleDC(hdc); SelectObject(memDC, hBit1); BitBlt(hdc, 0, 0, 128, 128, memDC, 0,0,SRCCOPY); SelectObject(memDC, hBit2); BitBlt(hdc, 128, 0, 128, 128, memDC, 0,0,SRCCOPY); EndPaint(hwnd,&ps); DeleteDC(memDC); break; case WM_DESTROY: DeleteObject(hBit1); DeleteObject(hBit2); PostQuitMessage(0); break; default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; }
Jak uzupełnić obsługę klawiatury aby np. po naciśnięciu prawego kursora bitmapa poruszała się w prawo po ekranie?
Nie zglebialem dokladnie calosci, ale pozycje obrazka musisz ustalac za pomkoca zmiennych, ktore bedziesz modyfikowal po nacisnieciu klawisza.
A nacisniecie klawisza wylapujesz w case WM_KEYDOWN.
Identyfikatory klawiszy masz w pomocy.
Strzalka w lewo to bodajze VK_LEFT a w prawo to VK_RIGHT. Wylapujesz je tak samo jak escape czy enter.
O to chodzilo? <_<
Nie zglebialem dokladnie calosci, ale pozycje obrazka musisz ustalac za pomkoca zmiennych, ktore bedziesz modyfikowal po nacisnieciu klawisza.
A nacisniecie klawisza wylapujesz w case WM_KEYDOWN.
Identyfikatory klawiszy masz w pomocy.
Strzalka w lewo to bodajze VK_LEFT a w prawo to VK_RIGHT. Wylapujesz je tak samo jak escape czy enter.
O to chodzilo? <_<

musisz zapisać sobie współrzędne bitmapy w zmiennych (strukturze), zmieniać je przy naciśnięciu klawiszy i użyć tych zmiennych w WM_PAINT.
Czyli mniej więcej tak:
(...) POINT pWsp = {0,0}; (...) switch(message) { case WM_KEYDOWN: switch (wParam) { case VK_LEFT: if(pWsp.x > 1) pWsp.x-=1; break; case VK_RIGHT: if(pWsp.x < 800) pWsp.x += 1; break; (...) SelectObject(memDC, hBit1); BitBlt(hdc, pWsp.x, pWsp.y, 128, 128, memDC, 0,0,SRCCOPY); (...)
Użytkownik bartolomeo4 edytował ten post 18 czerwiec 2006, 11:27