Advertisement
peterzig

[PIU] Wyświetlacz 7-segment

Nov 12th, 2016
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.53 KB | None | 0 0
  1. #include <windows.h>
  2.  
  3. TCHAR NazwaAplikacji[] = TEXT("Aplikacja studencka");
  4. TCHAR NazwaKlasy[] = TEXT("OKNOGLOWNE");
  5.  
  6. // ##### Definicja funkcji na samym dole #####
  7. void KtoreZielone(bool TabSeg[], int Liczba);
  8. // ###########################################
  9. // ##### Fukncja rysujaca kreske pozioma #####
  10. // ###########################################
  11. void KreskaPoz(HWND Okno, HDC Kontekst, int X, int Y, bool Zielone)
  12. {
  13.     HBRUSH Pedzel, Stary;
  14.     if (Zielone) Pedzel = CreateSolidBrush(0x00FF00); // Jezeli Zielone jest TRUE ma malowac na zielono
  15.     else Pedzel = CreateSolidBrush(0x333333); // Jezeli nie to na szaro
  16.     Stary = (HBRUSH)SelectObject(Kontekst, Pedzel);
  17.     POINT Uklad[6]; // Struktura zawierajaca punkty wielokata do narysowania
  18.     Uklad[0].x = X; Uklad[0].y = Y;
  19.     Uklad[1].x = X + 10; Uklad[1].y = Y + 10;
  20.     Uklad[2].x = X + 5; Uklad[2].y = Y + 40;
  21.     Uklad[3].x = X - 5; Uklad[3].y = Y + 50;
  22.     Uklad[4].x = X - 15; Uklad[4].y = Y + 40;
  23.     Uklad[5].x = X - 10; Uklad[5].y = Y + 10;
  24.     Polygon(Kontekst, Uklad, 6); // Rysowanie segmentu(wielokata) z elementow powyzej
  25.     SelectObject(Kontekst, Stary);
  26.     DeleteObject(Pedzel);
  27.     DeleteObject(Stary);
  28. }
  29. // ###########################################
  30. // ##### Fukncja rysujaca kreske pionowa #####
  31. // ###########################################
  32. void KreskaPion(HWND Okno, HDC Kontekst, int X, int Y, bool Zielone)
  33. {
  34.     HBRUSH Pedzel, Stary;
  35.     if (Zielone) Pedzel = CreateSolidBrush(0x00FF00); // Jezeli Zielone jest TRUE ma malowac na zielono
  36.     else Pedzel = CreateSolidBrush(0x333333); // Jezeli nie to na szaro
  37.     Stary = (HBRUSH)SelectObject(Kontekst, Pedzel);
  38.     POINT Uklad[6]; // Struktura zawierajaca punkty wielokata do narysowania
  39.     Uklad[0].x = X; Uklad[0].y = Y;
  40.     Uklad[1].x = X + 10; Uklad[1].y = Y - 10;
  41.     Uklad[2].x = X + 40; Uklad[2].y = Y - 10;
  42.     Uklad[3].x = X + 50; Uklad[3].y = Y;
  43.     Uklad[4].x = X + 40; Uklad[4].y = Y + 10;
  44.     Uklad[5].x = X + 10; Uklad[5].y = Y + 10;
  45.     Polygon(Kontekst, Uklad, 6); // Rysowanie segmentu(wielokata) z elementow powyzej
  46.     SelectObject(Kontekst, Stary);
  47.     DeleteObject(Pedzel);
  48.     DeleteObject(Stary);
  49. }
  50. // ###################################
  51. // ##### Glowna funkcja rysujaca #####
  52. // ###################################
  53. void Rysuj(HWND Okno, const int Licznik)
  54. {
  55.     bool TabSeg[7] = { 0 }; // Deklaracja tablicy z elementami bool, zainicjowana zerami
  56.                             // Tablica TabSeg[7] ta jest wykorzystywana do 'podswietlania' odpowiedni segmentow
  57.                             // Segmentow jest 7 wiec jest 7-elementowa tablica
  58.     PAINTSTRUCT PS;
  59.     HDC Kontekst = BeginPaint(Okno, &PS); // Tutaj zaczynamy rysowac piekne rzeczy
  60.     RECT Rect;
  61.     GetClientRect(Okno, &Rect);
  62.  
  63.     // Tablica przez ta funkcje jest odpowiednio wypelniana wartosciami "1" w zależności od podanej "Liczby" do wyswietlenia
  64.     KtoreZielone(TabSeg, Licznik);
  65.  
  66.     //KreskaPoz, pierwsze dwa parametry wiadomo, 3 i 4 gdzie ma narysowac segment(wielokat)
  67.     //ostatni paramet zawiera w tablicy '1' lub '0', w zaleznosci czy rysowany segment ma byc podswietlony(1) czy nie(0)
  68.     KreskaPoz(Okno, Kontekst, Rect.left + 27, Rect.top + 20, TabSeg[0]);
  69.     KreskaPoz(Okno, Kontekst, Rect.left + 82, Rect.top + 20, TabSeg[1]);
  70.     KreskaPoz(Okno, Kontekst, Rect.left + 22, Rect.top + 72, TabSeg[2]);
  71.     KreskaPoz(Okno, Kontekst, Rect.left + 77, Rect.top + 72, TabSeg[3]);
  72.     KreskaPion(Okno, Kontekst, Rect.left + 30, Rect.top + 20, TabSeg[4]);
  73.     KreskaPion(Okno, Kontekst, Rect.left + 25, Rect.top + 71, TabSeg[5]);
  74.     KreskaPion(Okno, Kontekst, Rect.left + 19, Rect.top + 123, TabSeg[6]);
  75.  
  76.     //No i dla formalnosci malujemy zielona kropke :)
  77.     HBRUSH Stary, Kropka = CreateSolidBrush(0x00FF00);
  78.     Stary = (HBRUSH)SelectObject(Kontekst, Kropka);
  79.     Ellipse(Kontekst, Rect.left + 75, Rect.top + 120, Rect.left + 90, Rect.top + 135);
  80.     // kasowanie nie uzywanych elementow
  81.     SelectObject(Kontekst, Stary);
  82.     DeleteObject(Kropka);
  83.     DeleteObject(Stary);
  84.     EndPaint(Okno, &PS);
  85. }
  86.  
  87. static LRESULT CALLBACK FunkcjaOkienkowa(HWND Okno, UINT Komunikat, WPARAM wParam, LPARAM lParam)
  88. {
  89.     static int Licznik = 0;
  90.     switch (Komunikat) {
  91.     case WM_PAINT:
  92.         Rysuj(Okno, Licznik);
  93.         break;
  94.     case WM_LBUTTONDOWN:
  95.         Licznik++;
  96.         Licznik %= 10; // Reszta z dzielenia przez 10
  97.         InvalidateRect(Okno, 0, 1);
  98.         break;
  99.     case WM_DESTROY:
  100.         PostQuitMessage(0);
  101.         break;
  102.     default:
  103.         return DefWindowProc(Okno, Komunikat, wParam, lParam);
  104.     }
  105.     return 0;
  106. }
  107.  
  108. static bool RejestrujKlasy()
  109. {
  110.     WNDCLASSEX wc;
  111.     wc.cbSize = sizeof(WNDCLASSEX);
  112.     wc.cbClsExtra = wc.cbWndExtra = 0;
  113.     wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
  114.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  115.     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  116.     wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
  117.     wc.hInstance = GetModuleHandle(NULL);
  118.     wc.lpfnWndProc = &FunkcjaOkienkowa;
  119.     wc.lpszClassName = NazwaKlasy;
  120.     wc.lpszMenuName = NULL;
  121.     wc.style = CS_HREDRAW | CS_VREDRAW;
  122.     return (RegisterClassEx(&wc) != 0);
  123. }
  124.  
  125. static void WyrejestrujKlasy()
  126. {
  127.     UnregisterClass(NazwaKlasy, GetModuleHandle(NULL));
  128. }
  129.  
  130. int WINAPI WinMain(HINSTANCE Instancja, HINSTANCE Poprzednia, LPSTR Parametry, int Widocznosc)
  131. {
  132.     // Zarejestruj klasę. Protestuj, jeżeli wystąpił błąd.
  133.     if (!RejestrujKlasy())
  134.     {
  135.         MessageBox(NULL, TEXT("Nie udało się zarejestrować klasy okna!"), NazwaAplikacji, MB_ICONSTOP | MB_OK);
  136.         return 1;
  137.     }
  138.     // Stwórz główne okno. Również protestuj, jeżeli wystąpił błąd.
  139.     HWND GlowneOkno = CreateWindowEx(WS_EX_APPWINDOW | WS_EX_CLIENTEDGE, NazwaKlasy, TEXT("Okno"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, Instancja, NULL);
  140.     if (GlowneOkno == NULL)
  141.     {
  142.         MessageBox(NULL, TEXT("Nie udało się stworzyć głównego okna!"), NazwaAplikacji, MB_ICONSTOP | MB_OK);
  143.         return 2;
  144.     }
  145.     // Wyświetl i uaktualnij nowo stworzone okno.
  146.     ShowWindow(GlowneOkno, Widocznosc);
  147.     UpdateWindow(GlowneOkno);
  148.     // Główna pętla komunikatów wątku.
  149.     MSG Komunikat;
  150.     while (GetMessage(&Komunikat, NULL, 0, 0) > 0)
  151.     {
  152.         TranslateMessage(&Komunikat);
  153.         DispatchMessage(&Komunikat);
  154.     }
  155.     // Zwolnij pamięć klas i zakończ proces.
  156.     WyrejestrujKlasy();
  157.     return static_cast<int>(Komunikat.wParam);
  158. }
  159. // ###################################################################################
  160. // ##### Funkcja wypelniajaca tablice boolawska w zaleznosci od podanej 'Liczby' #####
  161. // ###################################################################################
  162. void KtoreZielone(bool TabSeg[], int Liczba)
  163. {
  164.     switch (Liczba)
  165.     {
  166.     case 0:
  167.         TabSeg[0] = 1;
  168.         TabSeg[1] = 1;
  169.         TabSeg[2] = 1;
  170.         TabSeg[3] = 1;
  171.         TabSeg[4] = 1;
  172.         TabSeg[6] = 1;
  173.         break;
  174.     case 1: // np. aby narysowac jedynke podswietlic nalezy na zielono odpowiednie 2 segmety
  175.         TabSeg[1] = 1;
  176.         TabSeg[3] = 1;
  177.         break;
  178.     case 2:
  179.         TabSeg[1] = 1;
  180.         TabSeg[2] = 1;
  181.         TabSeg[4] = 1;
  182.         TabSeg[5] = 1;
  183.         TabSeg[6] = 1;
  184.         break;
  185.     case 3:
  186.         TabSeg[1] = 1;
  187.         TabSeg[3] = 1;
  188.         TabSeg[4] = 1;
  189.         TabSeg[5] = 1;
  190.         TabSeg[6] = 1;
  191.         break;
  192.     case 4:
  193.         TabSeg[0] = 1;
  194.         TabSeg[1] = 1;
  195.         TabSeg[4] = 0;
  196.         TabSeg[5] = 1;
  197.         TabSeg[3] = 1;
  198.         break;
  199.     case 5:
  200.         TabSeg[0] = 1;
  201.         TabSeg[3] = 1;
  202.         TabSeg[4] = 1;
  203.         TabSeg[5] = 1;
  204.         TabSeg[6] = 1;
  205.         break;
  206.     case 6:
  207.         TabSeg[0] = 1;
  208.         TabSeg[2] = 1;
  209.         TabSeg[3] = 1;
  210.         TabSeg[4] = 1;
  211.         TabSeg[5] = 1;
  212.         TabSeg[6] = 1;
  213.         break;
  214.     case 7:
  215.         TabSeg[1] = 1;
  216.         TabSeg[3] = 1;
  217.         TabSeg[4] = 1;
  218.         break;
  219.     case 8:
  220.         TabSeg[0] = 1;
  221.         TabSeg[1] = 1;
  222.         TabSeg[2] = 1;
  223.         TabSeg[3] = 1;
  224.         TabSeg[4] = 1;
  225.         TabSeg[5] = 1;
  226.         TabSeg[6] = 1;
  227.         break;
  228.     case 9:
  229.         TabSeg[0] = 1;
  230.         TabSeg[1] = 1;
  231.         TabSeg[3] = 1;
  232.         TabSeg[4] = 1;
  233.         TabSeg[5] = 1;
  234.         TabSeg[6] = 1;
  235.         break;
  236.     }
  237. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement