Advertisement
hugol

Untitled

Nov 7th, 2014
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.32 KB | None | 0 0
  1. /******************************************************************
  2. Grafika komputerowa, środowisko MS Windows - program przykładowy
  3. *****************************************************************/
  4.  
  5. #include <windows.h>
  6. #include <gdiplus.h>
  7. using namespace Gdiplus;
  8.  
  9.  
  10. //deklaracja funkcji obslugi okna
  11. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  12.  
  13. //funkcja Main - dla Windows
  14. int WINAPI WinMain(HINSTANCE hInstance,
  15. HINSTANCE hPrevInstance,
  16. LPSTR lpCmdLine,
  17. int nCmdShow)
  18. {
  19. MSG meldunek; //innymi slowy "komunikat"
  20. WNDCLASS nasza_klasa; //klasa głównego okna aplikacji
  21. HWND okno;
  22. static char nazwa_klasy[] = "Podstawowa";
  23.  
  24. GdiplusStartupInput gdiplusParametry;// parametry GDI+; domyślny konstruktor wypełnia strukturę odpowiednimi wartościami
  25. ULONG_PTR gdiplusToken; // tzw. token GDI+; wartość uzyskiwana przy inicjowaniu i przekazywana do funkcji GdiplusShutdown
  26.  
  27. // Inicjujemy GDI+.
  28. GdiplusStartup(&gdiplusToken, &gdiplusParametry, NULL);
  29.  
  30. //Definiujemy klase głównego okna aplikacji
  31. //Okreslamy tu wlasciwosci okna, szczegoly wygladu oraz
  32. //adres funkcji przetwarzajacej komunikaty
  33. nasza_klasa.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  34. nasza_klasa.lpfnWndProc = WndProc; //adres funkcji realizującej przetwarzanie meldunków
  35. nasza_klasa.cbClsExtra = 0 ;
  36. nasza_klasa.cbWndExtra = 0 ;
  37. nasza_klasa.hInstance = hInstance; //identyfikator procesu przekazany przez MS Windows podczas uruchamiania programu
  38. nasza_klasa.hIcon = 0;
  39. nasza_klasa.hCursor = LoadCursor(0, IDC_ARROW);
  40. nasza_klasa.hbrBackground = (HBRUSH) GetStockObject(GRAY_BRUSH);
  41. nasza_klasa.lpszMenuName = "Menu" ;
  42. nasza_klasa.lpszClassName = nazwa_klasy;
  43.  
  44. //teraz rejestrujemy klasę okna głównego
  45. RegisterClass (&nasza_klasa);
  46.  
  47. /*tworzymy okno główne
  48. okno będzie miało zmienne rozmiary, listwę z tytułem, menu systemowym
  49. i przyciskami do zwijania do ikony i rozwijania na cały ekran, po utworzeniu
  50. będzie widoczne na ekranie */
  51. okno = CreateWindow(nazwa_klasy, "Grafika komputerowa", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
  52. CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
  53.  
  54.  
  55. /* wybór rozmiaru i usytuowania okna pozostawiamy systemowi MS Windows */
  56. ShowWindow (okno, nCmdShow) ;
  57.  
  58. //odswiezamy zawartosc okna
  59. UpdateWindow (okno) ;
  60.  
  61. // GŁÓWNA PĘTLA PROGRAMU
  62. while (GetMessage(&meldunek, NULL, 0, 0))
  63. /* pobranie komunikatu z kolejki; funkcja GetMessage zwraca FALSE tylko dla
  64. komunikatu WM_QUIT; dla wszystkich pozostałych komunikatów zwraca wartość TRUE */
  65. {
  66. TranslateMessage(&meldunek); // wstępna obróbka komunikatu
  67. DispatchMessage(&meldunek); // przekazanie komunikatu właściwemu adresatowi (czyli funkcji obslugujacej odpowiednie okno)
  68. }
  69.  
  70. GdiplusShutdown(gdiplusToken);
  71.  
  72. return (int)meldunek.wParam;
  73. }
  74.  
  75. /********************************************************************
  76. FUNKCJA OKNA realizujaca przetwarzanie meldunków kierowanych do okna aplikacji*/
  77. LRESULT CALLBACK WndProc (HWND okno, UINT kod_meldunku, WPARAM wParam, LPARAM lParam)
  78. {
  79. HMENU mPlik, mInfo, mGlowne;
  80.  
  81.  
  82. static bool moving = false;
  83. static int movingi = 0;
  84. static POINT pkt_bezier[] = { { 300, 300 }, { 300, 250 }, { 300, 250 }, { 400, 250 },
  85. { 450, 250 }, { 400, 200 }, { 530, 200 },
  86. { 600, 200 }, { 600, 250 }, { 670, 270 },
  87. { 670, 320 }, { 300, 320 }, { 300, 300 }, };
  88.  
  89. /* PONIŻSZA INSTRUKCJA DEFINIUJE REAKCJE APLIKACJI NA POSZCZEGÓLNE MELDUNKI */
  90. switch (kod_meldunku)
  91. {
  92. case WM_CREATE: //meldunek wysyłany w momencie tworzenia okna
  93. mPlik = CreateMenu();
  94. AppendMenu(mPlik, MF_STRING, 100, "&Zapiszcz...");
  95. AppendMenu(mPlik, MF_SEPARATOR, 0, "");
  96. AppendMenu(mPlik, MF_STRING, 101, "&Koniec");
  97. mInfo = CreateMenu();
  98. AppendMenu(mInfo, MF_STRING, 200, "&Autor...");
  99. mGlowne = CreateMenu();
  100. AppendMenu(mGlowne, MF_POPUP, (UINT_PTR) mPlik, "&Plik");
  101. AppendMenu(mGlowne, MF_POPUP, (UINT_PTR) mInfo, "&Informacja");
  102. SetMenu(okno, mGlowne);
  103. DrawMenuBar(okno);
  104.  
  105. case WM_COMMAND: //reakcje na wybór opcji z menu
  106. switch (wParam)
  107. {
  108. case 100: if(MessageBox(okno, "Zapiszczeć?", "Pisk", MB_YESNO) == IDYES)
  109. MessageBeep(0);
  110. break;
  111. case 101: DestroyWindow(okno); //wysylamy meldunek WM_DESTROY
  112. break;
  113. case 200: MessageBox(okno, "Imię i nazwisko:\nNumer indeksu: ", "Autor", MB_OK);
  114. }
  115. return 0;
  116.  
  117. case WM_LBUTTONDOWN: //reakcja na lewy przycisk myszki
  118. {
  119. int x = LOWORD(lParam);
  120. int y = HIWORD(lParam);
  121. int selected = -1;
  122. for (int i = 0; i < sizeof(pkt_bezier) / sizeof(POINT); i++)
  123. {
  124. if (x<(pkt_bezier[i].x + 5 )&& x>(pkt_bezier[i].x - 5) && y<(pkt_bezier[i].y + 5) && y>(pkt_bezier[i].y - 5))
  125. {
  126. selected = i;
  127. break;
  128. }
  129. }
  130. if (selected == -1)
  131. return 0;
  132.  
  133. movingi = selected;
  134. moving = true;
  135. return 0;
  136. }
  137.  
  138. case WM_LBUTTONUP:
  139. {
  140. int x = LOWORD(lParam);
  141. int y = HIWORD(lParam);
  142. if (moving)
  143. {
  144. pkt_bezier[movingi].x = x;
  145. pkt_bezier[movingi].y = y;
  146. moving = false;
  147. }
  148. InvalidateRect(okno, NULL, true);
  149. return 0;
  150. }
  151.  
  152. case WM_MOUSEMOVE:
  153. {
  154. int x = LOWORD(lParam);
  155. int y = HIWORD(lParam);
  156. if (moving)
  157. {
  158. pkt_bezier[movingi].x = x;
  159. pkt_bezier[movingi].y = y;
  160. InvalidateRect(okno, NULL, true);
  161. }
  162.  
  163. return 0;
  164. }
  165.  
  166.  
  167. /*POINT pkt_bezier[] = { { 300, 300 }, { 300, 250 }, { 300, 250 }, { 400, 250 },
  168. { 450, 250 }, { 400, 200 }, { 530, 200 },
  169. { 600, 200 }, { 600, 250 }, { 670, 270 },
  170. { 670, 320 }, { 300, 320 }, { 300, 300 }, };
  171. */
  172. case WM_PAINT:
  173. {
  174. PAINTSTRUCT paint;
  175. HDC kontekst;
  176.  
  177. float x = 0.5;
  178. float y = 0.5;
  179. int offx = -120;
  180. int offy = -134;
  181.  
  182. POINT pkt[] = { { offx + 500 * x, offy + 500 * y }, { offx + 530 * x, offy + 500 * y }, { offx + 520 * x, offy + 510 * y }, { offx + 520 * x, offy + 550 * y }, { offx + 560 * x, offy + 500 * y }, { offx + 580 * x, offy + 500 * y }, { offx + 520 * x, offy + 570 * y }, { offx + 500 * x, offy + 570 * y } };
  183. POINT pkt2[] = { { offx + 500 * x, offy + 570 * y }, { offx + 500 * x, offy + 650 * y }, { offx + 520 * x, offy + 650 * y }, { offx + 520 * x, offy + 595 * y }, { offx + 560 * x, offy + 650 * y }, { offx + 580 * x, offy + 650 * y }, { offx + 520 * x, offy + 570 * y } };
  184. kontekst = BeginPaint(okno, &paint);
  185.  
  186. // MIEJSCE NA KOD GDI
  187.  
  188. HPEN pioro = CreatePen(PS_SOLID, 1, RGB(255,0,0));
  189. SelectObject(kontekst, pioro);
  190.  
  191. HBRUSH pedzel = CreateSolidBrush(RGB(100, 100, 100));
  192. SelectObject(kontekst, pedzel);
  193. Pie(kontekst, 100, 100, 200, 200, 70, 100, 100, 170);
  194. DeleteObject(pedzel);
  195.  
  196. pedzel = CreateSolidBrush(RGB(255, 100, 255));
  197. SelectObject(kontekst, pedzel);
  198. Pie(kontekst, 100, 100, 200, 200, 200, 170, 200, 70);
  199. DeleteObject(pedzel);
  200.  
  201. pedzel = CreateSolidBrush(RGB(100, 255, 255));
  202. SelectObject(kontekst, pedzel);
  203. Pie(kontekst, 100, 100, 200, 200, 200, 130, 100, 130);
  204. DeleteObject(pedzel);
  205.  
  206. pedzel = CreateSolidBrush(RGB(0, 200, 100));
  207. SelectObject(kontekst, pedzel);
  208. Pie(kontekst, 100, 100, 200, 200, 100, 170, 200, 170);
  209. DeleteObject(pedzel);
  210.  
  211. pedzel = CreateSolidBrush(RGB(255, 100, 0));
  212. SelectObject(kontekst, pedzel);
  213. Polygon(kontekst, pkt, sizeof(pkt) / sizeof(POINT));
  214. DeleteObject(pedzel);
  215.  
  216. pedzel = CreateSolidBrush(RGB(255, 100, 100));
  217. SelectObject(kontekst, pedzel);
  218. Polygon(kontekst, pkt2, sizeof(pkt2) / sizeof(POINT));
  219. DeleteObject(pedzel);
  220.  
  221. /*
  222. MoveToEx(kontekst, 500, 500, NULL);
  223. LineTo(kontekst, 530, 500);
  224. LineTo(kontekst, 520, 510);
  225. LineTo(kontekst, 520, 550);
  226. LineTo(kontekst, 560, 500);
  227. LineTo(kontekst, 580, 500);
  228. LineTo(kontekst, 520, 570);
  229. LineTo(kontekst, 590, 630);
  230. */
  231.  
  232.  
  233. //3*luk+1
  234. // 13
  235. pedzel = CreateSolidBrush(RGB(100, 255, 100));
  236. SelectObject(kontekst, CreateSolidBrush(RGB(100, 255, 100)));
  237. for (int i = 0; i < sizeof(pkt_bezier) / sizeof(POINT); i++)
  238. {
  239. Ellipse(kontekst, pkt_bezier[i].x - 5, pkt_bezier[i].y - 5, pkt_bezier[i].x + 5, pkt_bezier[i].y + 5);
  240. }
  241. DeleteObject(pedzel);
  242.  
  243. pedzel = CreateSolidBrush(RGB(100, 100, 100));
  244. SelectObject(kontekst, CreateSolidBrush(RGB(100, 100, 100)));
  245. PolyBezier(kontekst, pkt_bezier, 13);
  246.  
  247.  
  248. Ellipse(kontekst, 330, 290, 380, 340);
  249. Ellipse(kontekst, 570, 290, 620, 340);
  250.  
  251. DeleteObject(pedzel);
  252.  
  253. DeleteObject(pioro);
  254.  
  255. // utworzenie obiektu umożliwiającego rysowanie przy użyciu GDI+
  256. // (od tego momentu nie można używać funkcji GDI
  257. Graphics grafika(kontekst);
  258.  
  259. // MIEJSCE NA KOD GDI+
  260.  
  261.  
  262. // utworzenie czcionki i wypisanie tekstu na ekranie
  263. FontFamily fontFamily(L"Times New Roman");
  264. Font font(&fontFamily, 24, FontStyleRegular, UnitPixel);
  265. PointF pointF(100.0f, 400.0f);
  266. SolidBrush solidBrush(Color(255, 0, 0, 255));
  267.  
  268. //grafika.DrawString(L"To jest tekst napisany za pomocą GDI+.", -1, &font, pointF, &solidBrush);
  269.  
  270. EndPaint(okno, &paint);
  271.  
  272. return 0;
  273. }
  274.  
  275. case WM_DESTROY: //obowiązkowa obsługa meldunku o zamknięciu okna
  276. PostQuitMessage (0) ;
  277. return 0;
  278.  
  279. default: //standardowa obsługa pozostałych meldunków
  280. return DefWindowProc(okno, kod_meldunku, wParam, lParam);
  281. }
  282. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement