ďťż

Ł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
  •