Advertisement
Sooldierr

WinAPI - Paint

Nov 13th, 2017
410
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <windows.h>
  2. #include <ctime>
  3. #include <vector>
  4.  
  5. #define PROSTOKAT 1
  6. #define ELIPSA 2
  7. #define TROJKAT 3
  8. #define CLR_NUM 16
  9. #define WSP_X(ID) Figury[i].wsp[ID-1].x
  10. #define WSP_Y(ID) Figury[i].wsp[ID-1].y
  11. #define SZEROKOSC_PLOTNA rect.right * 0.75
  12. #define WYSOKOSC_PALETY rect.bottom * 0.70
  13. #define BIALY RGB(255, 255, 255)
  14. #define SZARY RGB(180, 180, 180)
  15. #define CZARNY RGB(0, 0, 0)
  16.  
  17. TCHAR CLNAME[] = TEXT("MojaKlasa");
  18. TCHAR APPNAME[] = TEXT("Paint - (R - reset)");
  19. HDC hdc;
  20.  
  21. struct figura
  22. {
  23.     POINT wsp[3];
  24.     COLORREF kolorWnetrza;
  25.     COLORREF kolorRamki;
  26.     int ksztalt;
  27. };
  28.  
  29. COLORREF kolory[CLR_NUM] =
  30. {
  31.     RGB(0,64,0),RGB(128,0,0),RGB(0,128,0),
  32.     RGB(128,128,64),RGB(0,0,160),RGB(128,0,128),
  33.     RGB(64,128,128),RGB(128,128,128),RGB(192,192,192),
  34.     RGB(255,0,0),RGB(0,255,0),RGB(255,255,0),
  35.     RGB(0,0,255),RGB(255,0,128),RGB(0,255,255), RGB(218,218,218)
  36. };
  37. // algorytm z neta http://www.geeksforgeeks.org/check-whether-a-given-point-lies-inside-a-triangle-or-not/ jedyna trudnosc w tym zadaniu imho.
  38. float area(const int x1, const int y1, const int x2, const int y2, const int x3, const int y3)
  39. {
  40.     return abs((x1*(y2 - y3) + x2*(y3 - y1) + x3*(y1 - y2)) / 2.0); // obliczanie pola trójkąta ze wzoru Herona (z samych boków)
  41. }
  42.  
  43. bool isInside(const int x1, const int y1, const int x2, const int y2, const int x3, const int y3, const int x, const int y)
  44. {
  45.     float A = area(x1, y1, x2, y2, x3, y3);
  46.     float A1 = area(x, y, x2, y2, x3, y3);
  47.     float A2 = area(x1, y1, x, y, x3, y3);
  48.     float A3 = area(x1, y1, x2, y2, x, y);
  49.     return (A == A1 + A2 + A3);
  50. }
  51.  
  52. bool isInElipse(const int x1, const int y1, const int x2, const int y2, const int x, const int y)
  53. {
  54.     int Ox = (x2 + x1) / 2; // wsp X środka elipsy
  55.     int Oy = (y2 + y1) / 2; // wsp Y środka elipsy
  56.     int r1 = (x2 - x1) / 2; // długość pierwszego promienia elipsy
  57.     int r2 = (y2 - y1) / 2; // długość drugiego promienia elipsy
  58.  
  59.     if ( ( ( (x - Ox) * (x - Ox) ) / (r1 * r1) ) + ( ( (y - Oy) * (y - Oy) ) / (r2 * r2) ) <= 1 )   // wzór czy punkt należy do elipsy
  60.         return true;
  61.     return false;
  62. }
  63.  
  64. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
  65.     srand(time(0));
  66.     static RECT rect;
  67.     static std::vector <figura> Figury;                     // wektor figur
  68.     static unsigned short int iloscFigur = 0;               // zmienna przechowująca aktualną ilość figur
  69.     static unsigned short int prostokaty = 0;                   // zmienna przechowująca aktualną ilość kwadratów
  70.     static unsigned short int elipsy = 0;                       // zmienna przechowująca aktualną ilość kół
  71.     static unsigned short int trojkaty = 0;                 // zmienna przechowująca aktualną ilość trójkąty
  72.     static COLORREF aktywnyPedzel = kolory[0];              // zmienna przechowująca aktualny wybrany kolor ramki
  73.     static COLORREF aktywnaRamka = kolory[CLR_NUM-1];           // zmienna przechowująca aktualny wybrany kolor wnętrza
  74.  
  75.     static HBRUSH brush = (HBRUSH)GetStockObject(DC_BRUSH); // uchwyt do urządzenia pędzla (wypełnianie obszaru jednym kolorem)
  76.     static HPEN pen = (HPEN)GetStockObject(DC_PEN);         // uchwyt do długopisu (rysowanie ramki wokół figur)
  77.  
  78.     switch (msg) {
  79.     case WM_KEYDOWN: {
  80.         switch ((int)wParam)
  81.         {
  82.         case 'r':
  83.             iloscFigur = 0;             // zmienna przechowująca aktualną ilość figur
  84.             prostokaty = 0;                 // zmienna przechowująca aktualną ilość kwadratów
  85.             elipsy = 0;                     // zmienna przechowująca aktualną ilość kół
  86.             trojkaty = 0;                   // zmienna przechowująca aktualną ilość trójkąty     
  87.  
  88.             while (!Figury.empty())
  89.                 Figury.pop_back();
  90.         default:
  91.             break;
  92.         }
  93.     }
  94.     case WM_CREATE: {
  95.         GetClientRect(hwnd, &rect);     //pobieranie  obszaru klienckiego (prostokąta)
  96.         iloscFigur = rand() % 10 + 10;  //losowanie ilości figur z przedziału 10-19
  97.         int ilosc = iloscFigur;     //bufor potrzebny do losowania ilości poszczególnych figur
  98.         prostokaty = rand() % ilosc;
  99.         ilosc -= prostokaty;
  100.         elipsy = rand() % ilosc;
  101.         trojkaty = ilosc - elipsy;
  102.  
  103.         //losowanie położenia figur na "płótnie" | r.right*0.75 to szerokość płótna dalej jest przybornik, na którym nie chcemy mieć figur rysowanych
  104.         for (unsigned int i = 0; i < iloscFigur; i++)
  105.         {
  106.             Figury.push_back(figura()); // dodajemy nową figurę do wektora
  107.             Figury[i].kolorWnetrza = kolory[rand() % CLR_NUM]; // ustawiamy nowej figurze kolor wnętrza
  108.             Figury[i].kolorRamki = kolory[rand() % CLR_NUM];    // ustawiamy nowej figurze kolor ramki
  109.  
  110.             WSP_X(1) = rand() % SZEROKOSC_PLOTNA; WSP_Y(1) = rand() % rect.bottom;      // losujemy współrzędne figury
  111.             WSP_X(2) = rand() % SZEROKOSC_PLOTNA; WSP_Y(2) = rand() % rect.bottom;      // ------------||-------------
  112.             if (WSP_X(1) > WSP_X(2))
  113.             {       // sortujemy współrzędne w razie potrzeby, aby otrzymać parami 2 sensowne punkty ( potrzebne do prawidłowego narysowania koła lub kwadratu
  114.                 int temp = WSP_X(1);
  115.                 WSP_X(1) = WSP_X(2);
  116.                 WSP_X(2) = temp;
  117.             }
  118.             if (WSP_Y(1) > WSP_Y(2))
  119.             {       // sortujemy współrzędne w razie potrzeby, aby otrzymać parami 2 sensowne punkty ( potrzebne do prawidłowego narysowania koła lub kwadratu
  120.                 int temp = WSP_Y(1);
  121.                 WSP_Y(1) = WSP_Y(2);
  122.                 WSP_Y(2) = temp;
  123.             }
  124.  
  125.             if (i < prostokaty)
  126.             {
  127.                 Figury[i].ksztalt = PROSTOKAT;      // przypisujemy po kolei kształty figurom w tablicy (najpierw wszystkie kwadraty, potem kola i trojkaty
  128.             }
  129.             else if (i >= prostokaty && i < prostokaty + elipsy)
  130.             {
  131.                 Figury[i].ksztalt = ELIPSA;
  132.             }
  133.             else if (i >= prostokaty + elipsy && i < iloscFigur)
  134.             {
  135.                 WSP_Y(2) = WSP_Y(1);        // ustawiamy wysokość Y1 i Y2 na taką samą, aby podstawa trójkąta równobocznego byłą równoległa do okna
  136.                 WSP_X(3) = (WSP_X(2) + WSP_X(1)) / 2.0;     // X3 wyznaczamy jako średnią X1 i X2, gdyż jest to trójkąt równoboczny
  137.                 WSP_Y(3) = WSP_Y(1) - ((sqrt(3) / 2.0) * (WSP_X(2) - WSP_X(1)));    // wyznaczmy Y3 z wysokości w trójkącie równobocznym
  138.  
  139.                 if (WSP_Y(3) < 0)       // jeśli z obliczeń wyszło, że wierzchołek trójkąta jest poza ekranem, to przesuwamy cały trójkąt w dół, aby się zmieścił
  140.                 {
  141.                     WSP_Y(1) = WSP_Y(2) -= WSP_Y(3);
  142.                     WSP_Y(3) = 0;
  143.                 }
  144.                 Figury[i].ksztalt = TROJKAT;
  145.             }
  146.         }
  147.         InvalidateRect(hwnd, &rect, TRUE);                      //odświeżanie obszaru klienckiego (płótna)
  148.     }break;
  149.         // obsługa przycisków myszy, obsługujemy wszystkie tak samo, gdyż wszystkie zaczynają się od identycznych intrukcji
  150.         // jedynie w kluczowych momentach w instrukcji switch decydujemy o konkretnych działaniach dla konkretnego przycisku myszy
  151.     case WM_LBUTTONDOWN:
  152.     case WM_RBUTTONDOWN:
  153.     case WM_MBUTTONDOWN:
  154.     {
  155.         int x = LOWORD(lParam);         //pobieranie wsp. x klikniętego miejsca z dodatkowego parametru lParam
  156.         int y = HIWORD(lParam);         //pobieranie wsp. y klikniętego miejsca z dodatkowego parametru lParam
  157.                    
  158.         if (x < SZEROKOSC_PLOTNA)       //sprawdzamy czy wskaźnik znajduje się poza przybornikiem
  159.         {
  160.             if (GetPixel(hdc, x, y) != BIALY)
  161.             {   //sprawdzamy za pomocą koloru piksela czy kliknięto na figurę czy na białe tło
  162.                 COLORREF temp_kolor = GetPixel(hdc, x, y);      //pobieramy kolor pikselu klikniętego
  163.                 for (int i = iloscFigur - 1; i >= 0; i--)           //pętla poszukiwania figury o pobranym kolorze
  164.                 {
  165.                     if (temp_kolor == Figury[i].kolorWnetrza)       // po kolorze sprawdzamy czy kliknięto w figurę
  166.                     {       // jednak może być więcej figur o takim kolorze, więc dokładnie sprawdzamy po współrzędnych co kliknięto
  167.                         if (Figury[i].ksztalt == PROSTOKAT && x >= WSP_X(1) && x <= WSP_X(2) && y >= WSP_Y(1) && y <= WSP_Y(2))
  168.                         {
  169.                             switch (msg)
  170.                             {
  171.                                 case WM_LBUTTONDOWN:    // dla lewego przycisku myszy po kliknięciu na prostokąt/elipsę zmieniamy jej kolor wnętrza i ramki
  172.                                 {
  173.                                     Figury[i].kolorWnetrza = aktywnyPedzel;
  174.                                     Figury[i].kolorRamki = aktywnaRamka;
  175.                                     break;
  176.                                 }
  177.                                 case WM_RBUTTONDOWN:    // dla prawego przycisku myszy po kliknięciu w prostokąt/elipsę obracamy ją o 90 stopni
  178.                                 {
  179.                                     // obracanie koła lub kwadratu, algorytm jednakowy i prosty
  180.                                     x = (WSP_X(2) - WSP_X(1)) / 2.0; y = (WSP_Y(2) - WSP_Y(1)) / 2.0;
  181.                                     WSP_X(1) += x - y; WSP_Y(1) += y - x;
  182.                                     WSP_X(2) += -x + y; WSP_Y(2) += -y + x;
  183.                                     break;
  184.                                 }
  185.                                 case WM_MBUTTONDOWN:    // dla środkowego przycisku myszy po kliknięciu w prostokąt/elipsę usuwamy ją
  186.                                 {
  187.                                     iloscFigur--;
  188.                                     prostokaty--;
  189.                                     Figury.erase(Figury.begin() + i);
  190.                                     break;
  191.                                 }
  192.                             }
  193.                             break;
  194.                         }
  195.                         else if (Figury[i].ksztalt == ELIPSA && isInElipse(WSP_X(1), WSP_Y(1), WSP_X(2), WSP_Y(2), x, y))
  196.                         {
  197.                             switch (msg)
  198.                             {
  199.                                 case WM_LBUTTONDOWN:    // dla lewego przycisku myszy po kliknięciu na prostokąt/elipsę zmieniamy jej kolor wnętrza i ramki
  200.                                 {
  201.                                     Figury[i].kolorWnetrza = aktywnyPedzel;
  202.                                     Figury[i].kolorRamki = aktywnaRamka;
  203.                                     break;
  204.                                 }
  205.                                 case WM_RBUTTONDOWN:    // dla prawego przycisku myszy po kliknięciu w prostokąt/elipsę obracamy ją o 90 stopni
  206.                                 {
  207.                                     // obracanie koła lub kwadratu, algorytm jednakowy i prosty
  208.                                     x = (WSP_X(2) - WSP_X(1)) / 2.0; y = (WSP_Y(2) - WSP_Y(1)) / 2.0;
  209.                                     WSP_X(1) += x - y; WSP_Y(1) += y - x;
  210.                                     WSP_X(2) += -x + y; WSP_Y(2) += -y + x;
  211.                                     break;
  212.                                 }
  213.                                 case WM_MBUTTONDOWN:    // dla środkowego przycisku myszy po kliknięciu w prostokąt/elipsę usuwamy ją
  214.                                 {
  215.                                     iloscFigur--;
  216.                                     elipsy--;
  217.                                     Figury.erase(Figury.begin() + i);
  218.                                     break;
  219.                                 }
  220.                             }
  221.                             break;
  222.                         }
  223.                         else if (Figury[i].ksztalt == TROJKAT)  //dla trojkąta potrzebne jest specjalne sprawdzanie czy kliknięto w jego obszar
  224.                         {
  225.                             if (isInside(WSP_X(1), WSP_Y(1), WSP_X(2), WSP_Y(2), WSP_X(3), WSP_Y(3), x, y))
  226.                             {
  227.                                 switch (msg)
  228.                                 {
  229.                                     case WM_LBUTTONDOWN:    // dla lewego przycisku myszy po kliknięciu na trójkąt zmieniamy jego kolor wnętrza i ramki
  230.                                     {
  231.  
  232.                                         Figury[i].kolorWnetrza = aktywnyPedzel;
  233.                                         Figury[i].kolorRamki = aktywnaRamka;
  234.                                        
  235.                                     }break;
  236.                                     case WM_RBUTTONDOWN:    // dla prawego przycisku myszy po kliknięciu w trójkąt obracamy go o 90 stopni
  237.                                     {
  238.                                         x = (WSP_X(1) + WSP_X(2) + WSP_X(3)) / 3.0; y = (WSP_Y(1) + WSP_Y(2) + WSP_Y(3)) / 3.0;
  239.                                         int temp = WSP_X(1);
  240.                                         WSP_X(1) = x - (WSP_Y(1) - y); WSP_Y(1) = y + temp - x;
  241.                                         temp = WSP_X(2);
  242.                                         WSP_X(2) = x - (WSP_Y(2) - y); WSP_Y(2) = y + temp - x;
  243.                                         temp = WSP_X(3);
  244.                                         WSP_X(3) = x - (WSP_Y(3) - y); WSP_Y(3) = y + temp - x;
  245.                                     }break;
  246.                                     case WM_MBUTTONDOWN:    // dla środkowego przycisku myszy po kliknięciu w trójkąt usuwamy go
  247.                                     {
  248.                                         trojkaty--;
  249.                                         iloscFigur--;
  250.                                         Figury.erase(Figury.begin() + i);
  251.                                     }break;
  252.                                 }
  253.                                 break;
  254.                             }                      
  255.                         }
  256.                     }
  257.                 }
  258.             }
  259.         }
  260.         else if (x > SZEROKOSC_PLOTNA && y < WYSOKOSC_PALETY)   //jeśli kliknięto w obszar przybornika to sprawdzamy czy kliknięto w kolor
  261.         {
  262.             if (GetPixel(hdc, x, y) != SZARY)       // sprawdzamy czy kliknięto w jakiś kolor a nie w szare tło
  263.             {
  264.                 switch (msg)
  265.                 {
  266.                     case WM_LBUTTONDOWN:
  267.                     {
  268.                         aktywnyPedzel = GetPixel(hdc, x, y);                // pobieramy nowy kolor dla wnętrza figury
  269.                         break;
  270.                     }
  271.                     case WM_RBUTTONDOWN:
  272.                     {
  273.                         aktywnaRamka = GetPixel(hdc, x, y);             // pobieramy nowy kolor dla ramki figury
  274.                         break;
  275.                     }
  276.                 }
  277.             }
  278.         }
  279.         InvalidateRect(hwnd, &rect, TRUE);                      //odświeżanie obszaru klienckiego (płótna)
  280.     }break;
  281.  
  282.     case WM_PAINT: {
  283.         PAINTSTRUCT ps;
  284.         GetClientRect(hwnd, &rect);
  285.         HDC hdc = BeginPaint(hwnd, &ps);            // rozpoczynamy rysowanie
  286.  
  287.         SetDCBrushColor(hdc, BIALY);    // ustawiamy kolor tła całego okna na biały
  288.         FillRect(hdc, &rect, brush);
  289.  
  290.         for (short int i = 0; i < iloscFigur; i++)
  291.         {
  292.             SetDCBrushColor(hdc, Figury[i].kolorWnetrza);   // ustawiamy kolor pędzla na kolor wnętrza figury
  293.             SelectObject(hdc, brush);                       // aktualizujemy kolor pędzla przypisanego do naszego okna
  294.             SetDCPenColor(hdc, Figury[i].kolorRamki);       // ustawiamy kolor ramki na kolor ramki figury
  295.             SelectObject(hdc, pen);                         // aktualizujemy kolor ramki przypisanego do naszego okna
  296.  
  297.             // poniżej sprawdzamy jaką figurę należy narysować i używamy odpowiedniej funkcji
  298.             if (Figury[i].ksztalt == PROSTOKAT)
  299.                 Rectangle(hdc, WSP_X(1), WSP_Y(1), WSP_X(2), WSP_Y(2));
  300.  
  301.             else if (Figury[i].ksztalt == ELIPSA)
  302.                 Ellipse(hdc, WSP_X(1), WSP_Y(1), WSP_X(2), WSP_Y(2));
  303.  
  304.             else if (Figury[i].ksztalt == TROJKAT)
  305.                 Polygon(hdc, Figury[i].wsp, 3);
  306.         }
  307.         // przywracamy kolor pędzla na szary (tło przybornika)
  308.         SetDCBrushColor(hdc, SZARY);
  309.         SelectObject(hdc, brush);
  310.         // przywracamy kolor pędzla na czarny (ramka kolorów w przyborniku)
  311.         SetDCPenColor(hdc, CZARNY);
  312.         SelectObject(hdc, pen);
  313.  
  314.         Rectangle(hdc, SZEROKOSC_PLOTNA, rect.top, rect.right, rect.bottom);    // rysujemy szary prostokąt (tło przybornika)
  315.  
  316.         for (int i = 0, przerwa = 0; i < CLR_NUM / 2; i++, przerwa += rect.bottom * 0.08)
  317.         {   // pętla rysująca naszą paletę kolorów, rysujemy w jednej iteracji po dwa kolory w rzędzie
  318.             SetDCBrushColor(hdc, kolory[i]);        // ustawiamy pędzel na dany kolor palety
  319.             SelectObject(hdc, brush);               // aktualizujemy pędzel naszego okna
  320.             Rectangle(hdc, rect.right * 0.8, (rect.bottom * 0.001) + (rect.bottom * 0.05) + przerwa, rect.right - (0.15 * rect.right), (rect.bottom * 0.12) + przerwa);
  321.            
  322.             SetDCBrushColor(hdc, kolory[i + 8]);    // ustawiamy pędzel na dany kolor palety
  323.             SelectObject(hdc, brush);               // aktualizujemy pędzel naszego okna
  324.             Rectangle(hdc, rect.right * 0.9, (rect.bottom * 0.001) + (rect.bottom * 0.05) + przerwa, rect.right - (0.05 * rect.right), (rect.bottom * 0.12) + przerwa);
  325.         }
  326.  
  327.         wchar_t text1[32];
  328.         SetBkColor(hdc, SZARY);     // ustawiamy kolor tła tekstu
  329.         SetTextColor(hdc, CZARNY);  // ustawiamy kolor tekstu
  330.  
  331.         // poniżej formatujemy napisy szczegółowego stanu figur i je wyświetlamy
  332.         wsprintfW(text1, L"Ilość figur : %d", iloscFigur);
  333.         TextOutW(hdc, rect.right * 0.80, rect.bottom * 0.68, text1, wcslen(text1));
  334.         wsprintfW(text1, L"Kwadraty : %d", prostokaty);
  335.         TextOutW(hdc, rect.right*0.80, rect.bottom * 0.71, text1, wcslen(text1));
  336.         wsprintfW(text1, L"Elipsy : %d", elipsy);
  337.         TextOutW(hdc, rect.right * 0.80, rect.bottom * 0.74, text1, wcslen(text1));
  338.         wsprintfW(text1, L"Trójkąty : %d", trojkaty);
  339.         TextOutW(hdc, rect.right * 0.80, rect.bottom * 0.77, text1, wcslen(text1));
  340.  
  341.         // wyświetlamy graficznie kolor wybranego aktualnie pędzla
  342.         TextOutW(hdc, rect.right * 0.80, rect.bottom * 0.82, L"Aktualny pędzel", 16);
  343.         SetDCBrushColor(hdc, aktywnyPedzel);
  344.         Rectangle(hdc, rect.right * 0.80, rect.bottom * 0.86, rect.right * 0.95, rect.bottom * 0.90);
  345.  
  346.         // wyświetlamy graficznie kolor wybranej aktualnie ramki
  347.         TextOutW(hdc, rect.right * 0.80, rect.bottom * 0.91, L"Aktualny długopis", 17);
  348.         SetDCBrushColor(hdc, aktywnaRamka);
  349.         Rectangle(hdc, rect.right * 0.80, rect.bottom * 0.95, rect.right * 0.95, rect.bottom * 0.99);
  350.        
  351.         EndPaint(hwnd, &ps);
  352.  
  353.     }break;
  354.  
  355.     case WM_CLOSE: {
  356.  
  357.         if (MessageBox(hwnd, TEXT("Czy chcesz zamknąć program?"), TEXT("Ostrzeżenie"), MB_ICONINFORMATION | MB_YESNO) == IDNO)
  358.             break;
  359.         // zwalniamy zasoby, czyli kontekst urządzenia, pędzel, pióro, figury
  360.         ReleaseDC(hwnd, hdc);
  361.         DeleteObject(brush);
  362.         DeleteObject(pen);
  363.         Figury.clear();
  364.         DestroyWindow(hwnd);
  365.     }break;
  366.  
  367.     case WM_DESTROY: {
  368.         PostQuitMessage(0);
  369.     }break;
  370.  
  371.     default: return DefWindowProc(hwnd, msg, wParam, lParam);
  372.     }
  373.  
  374.     return 0;
  375. }
  376.  
  377. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
  378.     WNDCLASSEX wc;
  379.  
  380.     wc.cbClsExtra = 0;
  381.     wc.cbSize = sizeof(WNDCLASSEX);
  382.     wc.cbWndExtra = 0;
  383.     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  384.     wc.hCursor = LoadCursor(0, IDC_ARROW);
  385.     wc.hIcon = LoadIcon(0, IDI_APPLICATION);
  386.     wc.hIconSm = LoadIcon(0, IDI_APPLICATION);
  387.     wc.hInstance = hInstance;
  388.     wc.lpfnWndProc = WndProc;
  389.     wc.lpszClassName = CLNAME;
  390.     wc.lpszMenuName = 0;
  391.     wc.style = CS_VREDRAW | CS_HREDRAW;
  392.  
  393.     if (!RegisterClassEx(&wc)) {
  394.         MessageBox(0, TEXT("Nie mogę rejestrować klasy!"), TEXT("ERROR"), MB_OK | MB_ICONERROR);
  395.         return 1;
  396.     }
  397.  
  398.     HWND hwnd = CreateWindowEx(0, CLNAME, APPNAME, WS_OVERLAPPEDWINDOW, 0, 0, 800, 600, 0, 0, hInstance, 0);
  399.     if (hwnd == NULL) {
  400.         MessageBox(0, TEXT("Nie mogę utworzyć okna!"), TEXT("ERROR"), MB_OK | MB_ICONERROR);
  401.         UnregisterClass(CLNAME, hInstance);
  402.         return 1;
  403.     }
  404.     ShowWindow(hwnd, nCmdShow);
  405.     MSG msg;
  406.     hdc = GetDC(hwnd);  // pobieramy kontekst urządzenia
  407.     while (GetMessage(&msg, 0, 0, 0) > 0) {
  408.         TranslateMessage(&msg);
  409.         DispatchMessage(&msg);
  410.     }
  411.    
  412.     UnregisterClass(CLNAME, hInstance);
  413.     return 0;
  414. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement