Advertisement
peterzig

[PIU] Zegar Analogowy

Nov 7th, 2016
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 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