kielbasior

Pierwszeocenianie_forum

Oct 17th, 2018
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.90 KB | None | 0 0
  1. /*Okienka stylu WS_OVERLAPPEDWINDOW, po kliknięciu lewym klawiszem myszy otwiera się nowe okno
  2. (ograniczenie do 5 okien + messagebox), po kliknięciu prawym myszki usuwają się wszystkie okienka poza
  3. okienkiem gdzie nastąpiło kliknięcie.
  4. Ostatnie okienko podczas zamykania ma uruchomić messagebox z pożegnaniem. */
  5.  
  6. #include "stdafx.h"
  7. #include <windows.h>
  8. #include <vector>
  9. #define ROZMIAR 5
  10. using std::vector;
  11.  
  12. HINSTANCE hInstance;
  13. vector <HWND> hwnd;
  14.  
  15. TCHAR nazwaKlasy[] = TEXT("Nazwa klasy okna");
  16. TCHAR nazwaAplikacji[] = TEXT("Aplikacja");
  17.  
  18. LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  19. {
  20.     switch (msg)
  21.     {
  22.     case WM_LBUTTONDOWN:
  23.         if (hwnd.size() < ROZMIAR)
  24.             hwnd.push_back(CreateWindowEx(0, nazwaKlasy, nazwaAplikacji, WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, 0));
  25.         else
  26.             MessageBox(hWnd, TEXT("Za dużo okien"), TEXT("Błąd"), MB_OK | MB_ICONERROR | MB_TASKMODAL);
  27.         break;
  28.     case WM_RBUTTONDOWN:
  29.         for (unsigned int i = 0; i < hwnd.size(); ++i)
  30.             if (hwnd[i] != hWnd)
  31.             {
  32.                 DestroyWindow(hwnd[i]);
  33.                 hwnd.erase(hwnd.begin() + i);
  34.                 i--;
  35.             }
  36.         break;
  37.     case WM_CLOSE:
  38.         if (hwnd.size() == 1)
  39.             MessageBox(hWnd, TEXT("Koniec"), TEXT("Zakończ"), MB_OK | MB_ICONINFORMATION);
  40.         for (unsigned int i = 0; i < hwnd.size(); ++i)
  41.             if (hwnd[i] == hWnd)
  42.             {
  43.                 DestroyWindow(hwnd[i]);
  44.                 hwnd.erase(hwnd.begin() + i);
  45.                 break;
  46.             }
  47.         if (hwnd.size() == 0)
  48.             PostQuitMessage(0);
  49.         break;
  50.     default:
  51.         return DefWindowProc(hWnd, msg, wParam, lParam);
  52.     }
  53.     return 0;
  54. }
  55. bool RejestracjaKlasy(WNDCLASSEX &wc)
  56. {
  57.     wc.cbClsExtra = 0;
  58.     wc.cbSize = sizeof(WNDCLASSEX);
  59.     wc.cbWndExtra = 0;
  60.     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  61.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  62.     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  63.     wc.hIconSm = 0;
  64.     wc.hInstance = hInstance;
  65.     wc.lpfnWndProc = WndProc;
  66.     wc.lpszClassName = nazwaKlasy;
  67.     wc.lpszMenuName = 0;
  68.     wc.style = CS_HREDRAW | CS_VREDRAW;
  69.     if (!RegisterClassEx(&wc))
  70.     {
  71.         MessageBox(0, TEXT("Błąd rejestracji klasy okna"), TEXT("Błąd"), MB_OK | MB_ICONERROR | MB_TASKMODAL);
  72.         return true;
  73.     }
  74.     return false;
  75. }
  76.  
  77. int WINAPI WinMain(HINSTANCE _hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
  78. {
  79.     hInstance = _hInstance;
  80.     WNDCLASSEX wc;
  81.     MSG msg;
  82.     if (RejestracjaKlasy(wc))
  83.         return 1;
  84.     hwnd.push_back(CreateWindowEx(0, nazwaKlasy, nazwaAplikacji, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, 0));
  85.     if (!hwnd[0])
  86.     {
  87.         MessageBox(0, TEXT("Błąd okna"), TEXT("Błąd"), MB_OK | MB_ICONERROR | MB_TASKMODAL);
  88.         return 1;
  89.     }
  90.     ShowWindow(hwnd[0], nShowCmd);
  91.     UpdateWindow(hwnd[0]);
  92.  
  93.     while (GetMessage(&msg, 0, 0, 0) > 0)
  94.     {
  95.         TranslateMessage(&msg);
  96.         DispatchMessage(&msg);
  97.     }
  98.     UnregisterClass(nazwaKlasy, hInstance);
  99.     return msg.wParam;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment