Advertisement
peterzig

Zegar dla taty

Nov 22nd, 2016
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.22 KB | None | 0 0
  1. // Zegar analogowy. GR3.
  2. // {PP}
  3. //#pragma warning( disable : 4244 )
  4. #include <windows.h>
  5. #include <cmath>
  6.  
  7. TCHAR EndCaption[] = TEXT("Zamykanie aplikacji");
  8. TCHAR EndText[] = TEXT("Czy chcesz zamknąć aplikację?");
  9.  
  10. int C = 523; // DO - dura 191ms - 382ms
  11. int D = 587; // RE - dura 170ms - 340ms
  12. int E = 659; // MI - dura 152ms - 304ms
  13. int F = 698; // FA - dura 143ms - 286ms
  14. int G = 740; // SOL - dura 135ms - 270ms
  15. int A = 880; // LA - dura 114ms - 228ms
  16. int B = 988; // SI - dura 110ms - 220ms
  17.  
  18. #define ID_TIMER 10
  19.  
  20. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  21.  
  22. POINT ObliczKordyCzasu(UINT czas, bool CzyGodzina = false)
  23. {
  24.     POINT tmp = { 0 };
  25.  
  26.     if (CzyGodzina)
  27.     {
  28.         if (czas>12) czas = czas % 12;
  29.         czas *= 30;
  30.         tmp.x = 120 * sin(czas*3.14 / 180); // po to by wskGodziny byla krotsza
  31.         tmp.y = 120 * cos(czas*3.14 / 180);
  32.         return tmp;
  33.     }
  34.     else czas *= 6;
  35.  
  36.     tmp.x = 160 * sin(czas*3.14 / 180);
  37.     tmp.y = 160 * cos(czas*3.14 / 180);
  38.  
  39.     return tmp;
  40. };
  41.  
  42. void RysujWskazowe(HDC hDC, HPEN &pen, POINT koniec)
  43. {
  44.     POINT krecha[2] = { { 0,0 } ,{ koniec.x,koniec.y } };
  45.     SelectObject(hDC, pen);
  46.     Polyline(hDC, krecha, 2);
  47. };
  48.  
  49. void WyswietlDzienTygodnia(HDC hDC, SYSTEMTIME &sys)
  50. {
  51.     //RECT rData = {-100,-60,100,-100};
  52.     RECT rData = { -200,190,-50,150 };
  53.     wchar_t temp[60];
  54.     wchar_t pomocnicza[20];
  55.  
  56.     switch (sys.wDayOfWeek)
  57.     {
  58.     case 0: wsprintf(pomocnicza, TEXT("Niedziela"), 0); break;
  59.     case 1: wsprintf(pomocnicza, TEXT("Poniedziałek"), 0); break;
  60.     case 2: wsprintf(pomocnicza, TEXT("Wtorek"), 0); break;
  61.     case 3: wsprintf(pomocnicza, TEXT("Środa"), 0); break;
  62.     case 4: wsprintf(pomocnicza, TEXT("Czwartek"), 0); break;
  63.     case 5: wsprintf(pomocnicza, TEXT("Piątek"), 0); break;
  64.     case 6: wsprintf(pomocnicza, TEXT("Sobota"), 0); break;
  65.     }
  66.     wsprintf(temp, TEXT("%s, %d.%d.%d"), pomocnicza, sys.wDay, sys.wMonth, sys.wYear);
  67.     SetTextColor(hDC, RGB(128, 0, 0));
  68.     DrawText(hDC, temp, -1, &rData, 0);
  69. };
  70.  
  71. void UstawRectTekstu(const UINT Godzina, RECT &rect)
  72. {
  73.     UINT czas = Godzina * 30;
  74.  
  75.     switch (Godzina)
  76.     {
  77.     case 1: case 2: case 10: case 11:
  78.         rect.left = 180 * sin(czas*3.14 / 180);
  79.         rect.top = 180 * cos(czas*3.14 / 180);
  80.         rect.right = 150 * sin(czas*3.14 / 180);
  81.         rect.bottom = 150 * cos(czas*3.14 / 180);
  82.         break;
  83.     case 4: case 5: case 7: case 8:
  84.         rect.left = 150 * sin(czas*3.14 / 180);
  85.         rect.top = 150 * cos(czas*3.14 / 180);
  86.         rect.right = 180 * sin(czas*3.14 / 180);
  87.         rect.bottom = 180 * cos(czas*3.14 / 180);
  88.         break;
  89.     case 3: case 9:
  90.         rect.left = 150 * sin(czas*3.14 / 180);
  91.         rect.top = 5;
  92.         rect.right = 180 * sin(czas*3.14 / 180);
  93.         rect.bottom = -15;
  94.         break;
  95.     case 6:
  96.         rect.left = 5;
  97.         rect.top = 150 * cos(czas*3.14 / 180);
  98.         rect.right = -5;
  99.         rect.bottom = 180 * cos(czas*3.14 / 180);
  100.         break;
  101.     case 12:
  102.         rect.left = 10;
  103.         rect.top = 175 * cos(czas*3.14 / 180);
  104.         rect.right = -6;
  105.         rect.bottom = 150 * cos(czas*3.14 / 180);
  106.         break;
  107.     };
  108.  
  109. };
  110.  
  111. void Rysuj(HWND hWnd)
  112. {
  113.     SYSTEMTIME sys;
  114.     RECT rect = { 0 }, rTekstu = { 0 };
  115.     HDC hDC;
  116.     HPEN hpGodz = 0, hpMin = 0, hpSec = 0;
  117.     PAINTSTRUCT pst = { 0 };
  118.     wchar_t tmp[60];
  119.  
  120.     GetClientRect(hWnd, &rect);
  121.     hpGodz = CreatePen(PS_SOLID, 3, RGB(0, 0, 0)); // kolory wskazowek
  122.     hpMin = CreatePen(PS_SOLID, 2, RGB(0, 0, 0)); // kolory wskazowek
  123.     hpSec = CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); // kolory wskazowek
  124.  
  125.     hDC = BeginPaint(hWnd, &pst);
  126.  
  127.     SetMapMode(hDC, MM_ISOTROPIC);
  128.     SetWindowExtEx(hDC, 400, 400, NULL);
  129.     SetViewportExtEx(hDC, rect.right, -rect.bottom, NULL);
  130.     SetViewportOrgEx(hDC, rect.right / 2, rect.bottom / 2, NULL);
  131.  
  132.     SelectObject(hDC, GetStockObject(BLACK_BRUSH));
  133.     SelectObject(hDC, GetStockObject(BLACK_PEN));
  134.  
  135.     //POINT b;
  136.     Ellipse(hDC, -4, 4, 4, -4); // srodek tarczy
  137.     for (double i = 0; i<360; i += 6) // sekundy
  138.         SetPixel(hDC, 180 * sin(i*3.14 / 180), 180 * cos(i*3.14 / 180), RGB(0, 0, 0));
  139.  
  140.     for (double i = 0; i<360; i += 30) // minuty/godziny
  141.         Ellipse(hDC, 180 * sin(i*3.14 / 180) - 2, 180 * cos(i*3.14 / 180) - 2,
  142.             180 * sin(i*3.14 / 180) + 2, 180 * cos(i*3.14 / 180) + 2);
  143.  
  144.     for (double i = 0; i<360; i += 90) // zaznaczenie glownych godzin, 12/3/6/9
  145.         Rectangle(hDC, 180 * sin(i*3.14 / 180) - 3, 180 * cos(i*3.14 / 180) - 3,
  146.             180 * sin(i*3.14 / 180) + 2, 180 * cos(i*3.14 / 180) + 2);
  147.  
  148.     GetLocalTime(&sys);
  149.     MoveToEx(hDC, 0, 0, NULL);
  150.     // wskazowki
  151.     RysujWskazowe(hDC, hpGodz, ObliczKordyCzasu(sys.wHour, true));
  152.     RysujWskazowe(hDC, hpMin, ObliczKordyCzasu(sys.wMinute));
  153.     RysujWskazowe(hDC, hpSec, ObliczKordyCzasu(sys.wSecond));
  154.  
  155.     SetBkMode(hDC, TRANSPARENT);
  156.     SetTextColor(hDC, RGB(120, 10, 15));
  157.     for (int i = 1; i<13; ++i) // cyfry pelnych godzin
  158.     {
  159.         wsprintf(tmp, TEXT("%d "), i);
  160.         UstawRectTekstu(i, rTekstu);
  161.         DrawText(hDC, tmp, -1, &rTekstu, DT_CENTER);
  162.     }
  163.     WyswietlDzienTygodnia(hDC, sys);
  164.  
  165.     //SelectObject(hDC, GetStockObject(BLACK_PEN));
  166.     DeleteObject(hpMin);
  167.     DeleteObject(hpSec);
  168.     DeleteObject(hpGodz);
  169.     EndPaint(hWnd, &pst);
  170. };
  171.  
  172.  
  173. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmdLine, int nShowCmd)
  174. {
  175.     WNDCLASSEX ex;
  176.  
  177.     ex.cbClsExtra = 0;
  178.     ex.cbSize = sizeof(WNDCLASSEX);
  179.     ex.cbWndExtra = 0;
  180.     ex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // kolor tla
  181.     ex.hCursor = 0;
  182.     ex.hIcon = 0;
  183.     ex.hIconSm = 0;
  184.     ex.hInstance = GetModuleHandle(NULL);
  185.     ex.lpfnWndProc = WndProc;
  186.     ex.lpszClassName = TEXT("glowne");
  187.     ex.lpszMenuName = 0;
  188.     ex.style = CS_HREDRAW | CS_VREDRAW;
  189.  
  190.     if (!RegisterClassEx(&ex)) return 0;
  191.  
  192.     HWND Handle = CreateWindowEx(0, TEXT("glowne"), TEXT("Zegar Analogowy"),
  193.         WS_OVERLAPPEDWINDOW,
  194.         50, 50, 600, 500,
  195.         0, 0, hInstance, 0);
  196.  
  197.     ShowWindow(Handle, SW_NORMAL);
  198.     UpdateWindow(Handle);
  199.  
  200.     if (!Handle) return 0;
  201.  
  202.     MSG msg;
  203.     while (GetMessage(&msg, 0, 0, 0) > 0)
  204.     {
  205.         TranslateMessage(&msg);
  206.         DispatchMessage(&msg);
  207.     }
  208.     UnregisterClass(TEXT("glowne"), hInstance);
  209.     return 0;
  210. };
  211.  
  212. LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  213. {
  214.     switch (msg)
  215.     {
  216.     case WM_CREATE:
  217.         SetTimer(hWnd, ID_TIMER, 1000, NULL);
  218.         break;
  219.     case WM_LBUTTONDOWN:
  220.         SetWindowText(hWnd, TEXT("Wszystkiego Najlepszego z okazji 50 urodzin!"));
  221.        
  222.         //for(int i=0; i<100;++i)
  223.         //  Beep(10*i, 200);
  224.        
  225.         Beep(C, 382);
  226.         Beep(C, 382);
  227.         Beep(D, 340);
  228.         Beep(C, 382);
  229.         Beep(F, 286);
  230.         Beep(E, 304);
  231.         Beep(0, 250);
  232.        
  233.         Beep(C, 382);
  234.         Beep(C, 382);
  235.         Beep(D, 340);
  236.         Beep(C, 382);
  237.         Beep(G, 270);
  238.         Beep(F, 286);
  239.         Beep(0, 250);
  240.    
  241.         Beep(C, 382);
  242.         Beep(C, 382);
  243.         Beep(C, 382);
  244.         Beep(A, 228);
  245.         Beep(F, 286);
  246.         Beep(E, 304);
  247.         Beep(D, 382);
  248.         Beep(0, 250);
  249.        
  250.         Beep(F, 286);
  251.         Beep(F, 286);
  252.         Beep(E, 304);
  253.         Beep(C, 382);
  254.         Beep(D, 382);
  255.         Beep(C, 382);
  256.         Beep(0, 270);
  257.         break;
  258.     case WM_PAINT:
  259.         Rysuj(hWnd);
  260.         break;
  261.     case WM_CLOSE:
  262.         if (MessageBox(hWnd, EndText, EndCaption, MB_YESNO) == IDYES) {
  263.             MessageBox(0, TEXT("Wszystkiego najlepszego!\nDużo zdrowia!\nSpełnienia marzeń!\nŻyczy Twój syn, Piotrek :D "), TEXT(""), MB_OK);
  264.             DestroyWindow(hWnd);
  265.         }
  266.         break;
  267.     case WM_DESTROY:
  268.         KillTimer(hWnd, ID_TIMER);
  269.         PostQuitMessage(0);
  270.         break;
  271.     case WM_TIMER:
  272.         InvalidateRect(hWnd, 0, true);
  273.         UpdateWindow(hWnd);
  274.         break;
  275.     default:
  276.         return DefWindowProc(hWnd, msg, wParam, lParam);
  277.     };
  278.     return DefWindowProc(hWnd, msg, wParam, lParam);
  279. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement