Advertisement
Alchemik96

PIU ZEGAR ANALOGOWY

Nov 21st, 2017
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.92 KB | None | 0 0
  1. // Zegar analogowy. GR3.
  2. // {PP}
  3. //#pragma warning( disable : 4244 )
  4. #include <windows.h>
  5. #include <cmath>
  6.  
  7. #define ID_TIMER 10
  8.  
  9. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  10.  
  11. POINT ObliczKordyCzasu(UINT czas, bool CzyGodzina = false)
  12. {
  13. POINT tmp = { 0 };
  14.  
  15. if (CzyGodzina)
  16. {
  17. if (czas>12) czas = czas % 12;
  18. czas *= 30;
  19. tmp.x = 120 * sin(czas*3.14 / 180); // po to by wskGodziny byla krotsza
  20. tmp.y = 120 * cos(czas*3.14 / 180);
  21. return tmp;
  22. }
  23. else czas *= 6;
  24.  
  25. tmp.x = 160 * sin(czas*3.14 / 180);
  26. tmp.y = 160 * cos(czas*3.14 / 180);
  27.  
  28. return tmp;
  29. };
  30.  
  31. void RysujWskazowe(HDC hDC, HPEN &pen, POINT koniec)
  32. {
  33. POINT krecha[2] = { { 0,0 } ,{ koniec.x,koniec.y } };
  34. SelectObject(hDC, pen);
  35. Polyline(hDC, krecha, 2);
  36. };
  37.  
  38. void WyswietlDzienTygodnia(HDC hDC, SYSTEMTIME &sys)
  39. {
  40. //RECT rData = {-100,-60,100,-100};
  41. RECT rData = { -200,190,-50,150 };
  42. wchar_t temp[60];
  43. wchar_t pomocnicza[20];
  44.  
  45. switch (sys.wDayOfWeek)
  46. {
  47. case 0: wsprintf(pomocnicza, TEXT("Niedziela"), 0); break;
  48. case 1: wsprintf(pomocnicza, TEXT("Poniedziałek"), 0); break;
  49. case 2: wsprintf(pomocnicza, TEXT("Wtorek"), 0); break;
  50. case 3: wsprintf(pomocnicza, TEXT("Ĺšroda"), 0); break;
  51. case 4: wsprintf(pomocnicza, TEXT("Czwartek"), 0); break;
  52. case 5: wsprintf(pomocnicza, TEXT("PiÄ…tek"), 0); break;
  53. case 6: wsprintf(pomocnicza, TEXT("Sobota"), 0); break;
  54. }
  55. wsprintf(temp, TEXT("%s, %d.%d.%d"), pomocnicza, sys.wDay, sys.wMonth, sys.wYear);
  56. SetTextColor(hDC, RGB(128, 0, 0));
  57. DrawText(hDC, temp, -1, &rData, 0);
  58. };
  59.  
  60. void UstawRectTekstu(const UINT Godzina, RECT &rect)
  61. {
  62. UINT czas = Godzina * 30;
  63.  
  64. switch (Godzina)
  65. {
  66. case 1: case 2: case 10: case 11:
  67. rect.left = 180 * sin(czas*3.14 / 180);
  68. rect.top = 180 * cos(czas*3.14 / 180);
  69. rect.right = 150 * sin(czas*3.14 / 180);
  70. rect.bottom = 150 * cos(czas*3.14 / 180);
  71. break;
  72. case 4: case 5: case 7: case 8:
  73. rect.left = 150 * sin(czas*3.14 / 180);
  74. rect.top = 150 * cos(czas*3.14 / 180);
  75. rect.right = 180 * sin(czas*3.14 / 180);
  76. rect.bottom = 180 * cos(czas*3.14 / 180);
  77. break;
  78. case 3: case 9:
  79. rect.left = 150 * sin(czas*3.14 / 180);
  80. rect.top = 5;
  81. rect.right = 180 * sin(czas*3.14 / 180);
  82. rect.bottom = -15;
  83. break;
  84. case 6:
  85. rect.left = 5;
  86. rect.top = 150 * cos(czas*3.14 / 180);
  87. rect.right = -5;
  88. rect.bottom = 180 * cos(czas*3.14 / 180);
  89. break;
  90. case 12:
  91. rect.left = 10;
  92. rect.top = 175 * cos(czas*3.14 / 180);
  93. rect.right = -6;
  94. rect.bottom = 150 * cos(czas*3.14 / 180);
  95. break;
  96. };
  97.  
  98. };
  99.  
  100. void Rysuj(HWND hWnd)
  101. {
  102. SYSTEMTIME sys;
  103. RECT rect = { 0 }, rTekstu = { 0 };
  104. HDC hDC;
  105. HPEN hpGodz = 0, hpMin = 0, hpSec = 0;
  106. PAINTSTRUCT pst = { 0 };
  107. wchar_t tmp[60];
  108.  
  109. GetClientRect(hWnd, &rect);
  110. hpGodz = CreatePen(PS_SOLID, 3, RGB(0, 0, 0)); // kolory wskazowek
  111. hpMin = CreatePen(PS_SOLID, 2, RGB(0, 0, 0)); // kolory wskazowek
  112. hpSec = CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); // kolory wskazowek
  113.  
  114. hDC = BeginPaint(hWnd, &pst);
  115.  
  116. SetMapMode(hDC, MM_ISOTROPIC);
  117. SetWindowExtEx(hDC, 400, 400, NULL);
  118. SetViewportExtEx(hDC, rect.right, -rect.bottom, NULL);
  119. SetViewportOrgEx(hDC, rect.right / 2, rect.bottom / 2, NULL);
  120.  
  121. SelectObject(hDC, GetStockObject(BLACK_BRUSH));
  122. SelectObject(hDC, GetStockObject(BLACK_PEN));
  123.  
  124. //POINT b;
  125. Ellipse(hDC, -4, 4, 4, -4); // srodek tarczy
  126. for (double i = 0; i<360; i += 6) // sekundy
  127. SetPixel(hDC, 180 * sin(i*3.14 / 180), 180 * cos(i*3.14 / 180), RGB(255, 255, 255));
  128.  
  129. for (double i = 0; i<360; i += 30) // minuty/godziny
  130. Ellipse(hDC, 180 * sin(i*3.14 / 180) - 2, 180 * cos(i*3.14 / 180) - 2,
  131. 180 * sin(i*3.14 / 180) + 2, 180 * cos(i*3.14 / 180) + 2);
  132.  
  133. for (double i = 0; i<360; i += 90) // zaznaczenie glownych godzin, 12/3/6/9
  134. Rectangle(hDC, 180 * sin(i*3.14 / 180) - 3, 180 * cos(i*3.14 / 180) - 3,
  135. 180 * sin(i*3.14 / 180) + 2, 180 * cos(i*3.14 / 180) + 2);
  136.  
  137. GetLocalTime(&sys);
  138. MoveToEx(hDC, 0, 0, NULL);
  139. // wskazowki
  140. RysujWskazowe(hDC, hpGodz, ObliczKordyCzasu(sys.wHour, true));
  141. RysujWskazowe(hDC, hpMin, ObliczKordyCzasu(sys.wMinute));
  142. RysujWskazowe(hDC, hpSec, ObliczKordyCzasu(sys.wSecond));
  143.  
  144. SetBkMode(hDC, TRANSPARENT);
  145. SetTextColor(hDC, RGB(120, 10, 15));
  146. for (int i = 1; i<13; ++i) // cyfry pelnych godzin
  147. {
  148. wsprintf(tmp, TEXT("%d "), i);
  149. UstawRectTekstu(i, rTekstu);
  150. DrawText(hDC, tmp, -1, &rTekstu, DT_CENTER);
  151. }
  152. WyswietlDzienTygodnia(hDC, sys);
  153.  
  154. //SelectObject(hDC, GetStockObject(BLACK_PEN));
  155. DeleteObject(hpMin);
  156. DeleteObject(hpSec);
  157. DeleteObject(hpGodz);
  158. EndPaint(hWnd, &pst);
  159. };
  160.  
  161.  
  162. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmdLine, int nShowCmd)
  163. {
  164. WNDCLASSEX ex;
  165.  
  166. ex.cbClsExtra = 0;
  167. ex.cbSize = sizeof(WNDCLASSEX);
  168. ex.cbWndExtra = 0;
  169. ex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // kolor tla
  170. ex.hCursor = 0;
  171. ex.hIcon = 0;
  172. ex.hIconSm = 0;
  173. ex.hInstance = GetModuleHandle(NULL);
  174. ex.lpfnWndProc = WndProc;
  175. ex.lpszClassName = TEXT("glowne");
  176. ex.lpszMenuName = 0;
  177. ex.style = CS_HREDRAW | CS_VREDRAW;
  178.  
  179. if (!RegisterClassEx(&ex)) return 0;
  180.  
  181. HWND Handle = CreateWindowEx(0, TEXT("glowne"), TEXT("Zegar Analogowy"),
  182. WS_OVERLAPPEDWINDOW,
  183. 50, 50, 600, 500,
  184. 0, 0, hInstance, 0);
  185.  
  186. ShowWindow(Handle, SW_NORMAL);
  187. UpdateWindow(Handle);
  188.  
  189. if (!Handle) return 0;
  190.  
  191. MSG msg;
  192. while (GetMessage(&msg, 0, 0, 0) > 0)
  193. {
  194. TranslateMessage(&msg);
  195. DispatchMessage(&msg);
  196. }
  197. UnregisterClass(TEXT("glowne"), hInstance);
  198. return 0;
  199. };
  200.  
  201. LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  202. {
  203. switch (msg)
  204. {
  205. case WM_CREATE:
  206. SetTimer(hWnd, ID_TIMER, 1000, NULL);
  207. break;
  208. case WM_PAINT:
  209. Rysuj(hWnd);
  210. break;
  211. case WM_DESTROY:
  212. KillTimer(hWnd, ID_TIMER);
  213. PostQuitMessage(0);
  214. break;
  215. case WM_TIMER:
  216. InvalidateRect(hWnd, 0, true);
  217. UpdateWindow(hWnd);
  218. break;
  219. default:
  220. return DefWindowProc(hWnd, msg, wParam, lParam);
  221. };
  222. return DefWindowProc(hWnd, msg, wParam, lParam);
  223. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement