Advertisement
Spa_m

PIU_Temperatura

Nov 29th, 2016
3,802
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <Windows.h>
  2. #include <stdio.h>
  3.  
  4. enum { CELSJUSZ, KELWIN, FAHRENHEIT };
  5.  
  6. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  7. {
  8.     static HWND edit_C, edit_K, edit_F, static_C, static_K, static_F;   // uchwyty do kontrolek
  9.     switch (msg)
  10.     {
  11.     case WM_CREATE:
  12.     {
  13.         // taki myk na wydobycie identyfikatora instancji naszego programu z parametru lParam ;)
  14.         HINSTANCE &hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
  15.         // pola tekstowe, w kt�rych b�d� wpisywane i aktualizowane aktualne przelizone temperatury w r�nych skalach
  16.         // po�o�enie i wymiary podane s� byle jakie, bo i tak s� ustawiane na poprawne w obs�udze komunikatu WM_SIZE (zmiana rozmiaru okna)
  17.         edit_C = CreateWindowEx(0, TEXT("EDIT"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_NUMBER, 1, 2, 3, 4, hwnd, (HMENU)0, hInstance, NULL);
  18.         edit_K = CreateWindowEx(0, TEXT("EDIT"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_NUMBER, 5, 6, 7, 8, hwnd, (HMENU)1, hInstance, NULL);
  19.         edit_F = CreateWindowEx(0, TEXT("EDIT"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_NUMBER, 9, 10, 11, 12, hwnd, (HMENU)2, hInstance, NULL);
  20.  
  21.         // pola statyczne (nieedytowalne), kt�re b�d� wy�wietla� opis pola tekstowego, jakiej skali dotyczy temperatura
  22.         // po�o�enie i wymiary podane s� byle jakie, bo i tak s� ustawiane na poprawne w obs�udze komunikatu WM_SIZE (zmiana rozmiaru okna)
  23.         static_C = CreateWindowEx(0, TEXT("STATIC"), TEXT("Celsjusz"), WS_CHILD | WS_VISIBLE | WS_BORDER, 13, 14, 15, 16, hwnd, (HMENU)4, hInstance, NULL);
  24.         static_K = CreateWindowEx(0, TEXT("STATIC"), TEXT("Kelwin"), WS_CHILD | WS_VISIBLE | WS_BORDER, 17, 18, 19, 20, hwnd, (HMENU)5, hInstance, NULL);
  25.         static_F = CreateWindowEx(0, TEXT("STATIC"), TEXT("Farenheit"), WS_CHILD | WS_VISIBLE | WS_BORDER, 21, 22, 23, 24, hwnd, (HMENU)6, hInstance, NULL);
  26.     }break;
  27.  
  28.     case WM_COMMAND:
  29.     {
  30.         static char buff[11];
  31.         static double temp_C = 0;   //
  32.         static double temp_K = 0;   // zmienne przechowuj�ce temperatury w ka�dej skali
  33.         static double temp_F = 0;   //
  34.  
  35.         switch (LOWORD(wParam))
  36.         {
  37.         case CELSJUSZ:
  38.         {
  39.             // sprawdzamy czy klikni�ta kontrolka dalej ma focusa
  40.             if (GetFocus() != (HWND)lParam)
  41.                 break;
  42.             // pobieramy temperatur� wpisan� do pola edycyjnego temperatury w Celsjuszach
  43.             GetWindowTextA(edit_C, buff, 10);
  44.  
  45.             temp_C = atof(buff);        // konwertujemy pobrany tekst na liczb� (Celsjusze)
  46.             temp_K = temp_C + 273.15;   // przeliczamy temperatur� z Celsjuszy na Kelwiny
  47.             temp_F = 1.8 * temp_C + 32; // przeliczamy temperatur� z Celsjuszy na Farenheity
  48.  
  49.             sprintf_s(buff, "%.2lf", temp_K);   // konwertujemy przeliczon� temperatur� w Kelwinach na tekst
  50.             SetWindowTextA(edit_K, buff);       // wpisujemy przeliczon� temperatur� w Kelwinach do odpowiedniego pola edycyjnego
  51.             sprintf_s(buff, "%.2lf", temp_F);   // konwertujemy przeliczon� temperatur� w Farenheitach na tekst
  52.             SetWindowTextA(edit_F, buff);       // wpisujemy przeliczon� temperatur� w Farenheitach do odpowiedniego pola edycyjnego
  53.  
  54.         }break;
  55.  
  56.         case KELWIN:
  57.         {
  58.             // sprawdzamy czy klikni�ta kontrolka dalej ma focusa
  59.             if (GetFocus() != (HWND)lParam)
  60.                 break;
  61.             // pobieramy temperatur� wpisan� do pola edycyjnego temperatury w Kelwinach
  62.             GetWindowTextA(edit_K, buff, 10);
  63.  
  64.             temp_K = atof(buff);        // konwertujemy pobrany tekst na liczb� (Kelwiny)
  65.             temp_C = temp_K - 273.15;   // przeliczamy temperatur� z Kelwin�w na Celsjusze
  66.             temp_F = 1.8 * temp_C + 32; // przeliczamy temperatur� z Celsjuszy na Farenheity
  67.  
  68.             sprintf_s(buff, "%.2lf", temp_C);   // konwertujemy przeliczon� temperatur� w Celsjuszach na tekst
  69.             SetWindowTextA(edit_C, buff);       // wpisujemy przeliczon� temperatur� w Celsjuszach do odpowiedniego pola edycyjnego
  70.             sprintf_s(buff, "%.2lf", temp_F);   // konwertujemy przeliczon� temperatur� w Farenheitach na tekst
  71.             SetWindowTextA(edit_F, buff);       // wpisujemy przeliczon� temperatur� w Farenheitach do odpowiedniego pola edycyjnego
  72.  
  73.         }break;
  74.  
  75.         case FAHRENHEIT:
  76.         {
  77.             // sprawdzamy czy klikni�ta kontrolka dalej ma focusa
  78.             if (GetFocus() != (HWND)lParam)
  79.                 break;
  80.             // pobieramy temperatur� wpisan� do pola edycyjnego temperatury w Farenheitach
  81.             GetWindowTextA(edit_F, buff, 10);
  82.  
  83.             temp_F = atof(buff);                // konwertujemy pobrany tekst na liczb� (Kelwiny)
  84.             temp_C = (5.0 / 9.0) * (temp_F - 32);   // przeliczamy temperatur� z Farenheit�w na Celsjusze
  85.             temp_K = temp_C + 273.15;           // przeliczamy temperatur� z Celsjuszy na Kelwiny
  86.  
  87.             sprintf_s(buff, "%.2lf", temp_C);   // konwertujemy przeliczon� temperatur� w Celsjuszach na tekst
  88.             SetWindowTextA(edit_C, buff);       // wpisujemy przeliczon� temperatur� w Celsjuszach do odpowiedniego pola edycyjnego
  89.             sprintf_s(buff, "%.2lf", temp_K);   // konwertujemy przeliczon� temperatur� w Kelwinach na tekst
  90.             SetWindowTextA(edit_K, buff);       // wpisujemy przeliczon� temperatur� w Kelwinach do odpowiedniego pola edycyjnego
  91.         }break;
  92.         };
  93.     }
  94.     break;
  95.     case WM_SIZE:
  96.     {
  97.         // Przy zmianie rozmiaru ustalamy nowe wymiary i po�o�enia element�w
  98.         RECT windowRect;
  99.         GetClientRect(hwnd, &windowRect);           // pobieramy aktualne wymiary obszaru klienckiego
  100.         int xEdit = (windowRect.right - 50) / 2;    // wsp X pocz�tku p�l edycyjnych
  101.         int y = 10;                                 // wsp Y pocz�tku wszystkich p�l
  102.         int xStatic = (windowRect.right - 190) / 2; // wsp X pocz�tku p�l telstowych statycznych
  103.         int witdhEdit = 100;                        // szeroko�� p�l edycyjnych
  104.         int height = 20;                            // wysoko�� wszystkich p�l
  105.         int widthStatic = 70;                       // szeroko�� p�l statycznych
  106.                                                     // ustawianie pola statycznego i edycyjnego dotycz�cych temperatury Celsjusza
  107.         MoveWindow(static_C, xStatic, y, widthStatic, height, TRUE);
  108.         MoveWindow(edit_C, xEdit, y, witdhEdit, height, TRUE);
  109.  
  110.         // ustawianie pola statycznego i edycyjnego dotycz�cych temperatury Kelwina
  111.         MoveWindow(static_K, xStatic, y += height + 10, widthStatic, height, TRUE);
  112.         MoveWindow(edit_K, xEdit, y, witdhEdit, height, TRUE);
  113.  
  114.         // ustawianie pola statycznego i edycyjnego dotycz�cych temperatury Farenheita
  115.         MoveWindow(static_F, xStatic, y += height + 10, widthStatic, height, TRUE);
  116.         MoveWindow(edit_F, xEdit, y, witdhEdit, height, TRUE);
  117.  
  118.     }break;
  119.  
  120.     case WM_CLOSE:
  121.         DestroyWindow(hwnd);
  122.         break;
  123.  
  124.     case WM_DESTROY:
  125.         PostQuitMessage(0);
  126.         break;
  127.  
  128.         //Ustawianie minimalnego rozmiaru okna:
  129.     case WM_GETMINMAXINFO:
  130.         ((MINMAXINFO *)lParam)->ptMinTrackSize.x = 260; // minimalna szeroko��
  131.         ((MINMAXINFO *)lParam)->ptMinTrackSize.y = 200; // minimalna wysoko��
  132.         break;
  133.  
  134.     default:
  135.         return DefWindowProc(hwnd, msg, wParam, lParam);
  136.     }
  137.     return 0;
  138. }
  139.  
  140. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  141. {
  142.     WNDCLASSEX window;
  143.     HWND hwnd;
  144.     MSG msg;
  145.     TCHAR ClassName[] = TEXT("KlasaOkna");
  146.     TCHAR WindowTitle[] = TEXT("Przeliczanie temperatur");
  147.  
  148.     window.cbClsExtra = NULL;
  149.     window.cbSize = sizeof(WNDCLASSEX);
  150.     window.cbWndExtra = NULL;
  151.     window.hbrBackground = (HBRUSH)(COLOR_WINDOW);
  152.     window.hCursor = LoadCursor(NULL, IDC_ARROW);
  153.     window.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  154.     window.hIconSm = NULL;
  155.     window.hInstance = hInstance;
  156.     window.lpfnWndProc = WndProc;
  157.     window.lpszClassName = ClassName;
  158.     window.lpszMenuName = 0;
  159.     window.style = CS_VREDRAW | CS_HREDRAW;
  160.  
  161.     if (!RegisterClassEx(&window))
  162.         return 0;
  163.  
  164.     hwnd = CreateWindowEx(WS_EX_WINDOWEDGE, ClassName, WindowTitle, WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 200, 300, NULL, NULL, hInstance, NULL);
  165.  
  166.     if (hwnd == NULL)
  167.     {
  168.         UnregisterClass(ClassName, hInstance);
  169.         return 0;
  170.     }
  171.  
  172.     ShowWindow(hwnd, nCmdShow);
  173.     UpdateWindow(hwnd);
  174.  
  175.     while (GetMessage(&msg, NULL, 0, 0) > 0)
  176.     {
  177.         TranslateMessage(&msg);
  178.         DispatchMessage(&msg);
  179.     }
  180.     UnregisterClass(ClassName, hInstance);
  181.     return msg.wParam;
  182. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement