Advertisement
Sooldierr

WinAPI - Przelicznik Cale-Cm

Dec 7th, 2017
655
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. static const unsigned int WINDOW_WIDTH = 200;
  5. static const unsigned int WINDOW_HEIGHT = 100;
  6. static const unsigned int BUTTON_WIDTH = 70;
  7. static const unsigned int BUTTON_HEIGHT = 20;
  8. static const double PREDICTOR = 2.54;
  9.  
  10. enum {CM_NA_CALE, CALE_NA_CM, TEXTBOX, STATICBOX};
  11.  
  12. HWND hWnd;  // uchwyty do okna i kontrolek
  13.  
  14. void Przelicz()
  15. {
  16.     char text[11];
  17.     const int len = sizeof(text);
  18.     GetWindowTextA(GetDlgItem(hWnd, TEXTBOX), text, len);
  19.     // program rozpoznaje kropkę jako część ułamkową, dlatego zamieniamy przecinek jeśli go znajdziemy
  20.     for(int i = 0; i < len; i++)
  21.         if (text[i] == ',')
  22.         {
  23.             text[i] = '.';
  24.             break;
  25.         }
  26.     // konwersja z tekstu na liczbę
  27.     double value = atof(text);
  28.     // jeśli centymetry na cale zaznaczone, to przeliczamy na cale
  29.     if ((IsDlgButtonChecked(hWnd, CM_NA_CALE) == BST_CHECKED))
  30.         value /= PREDICTOR;     // dzielimy liczbę centymetrów przez jednostkową wartość cala w cm
  31.  
  32.     else
  33.         value *= PREDICTOR;     // dzielimy liczbę cali przez jednostkową wartość cala w cm
  34.     // zamieniamy liczbę na tekst a następnie ją wpisujemy w polu statycznym
  35.     sprintf_s(text, "%.2f", value);
  36.    
  37.     SetWindowTextA(GetDlgItem(hWnd, STATICBOX), text);
  38. }
  39.  
  40. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  41. {
  42.     switch (msg)
  43.     {
  44.         case WM_CREATE:
  45.             {
  46.                 hWnd = hwnd;
  47.                 //Dostanie się do hInstance wewnątrz WndProc bez deklarowania globalnej zmiennej.
  48.                 HINSTANCE &hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
  49.  
  50.                 //Początkowe pozycje i tak nie są ważne - zostaną przesunięte w WM_SIZE
  51.                 CreateWindowEx(0, "BUTTON", "Centymetry na cale.", WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON,
  52.                     10, 150, 150, 20, hwnd, (HMENU)CM_NA_CALE,
  53.                     hInstance, NULL);
  54.  
  55.                 CreateWindowEx(0, "BUTTON", "Cale na centymetry.", WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON,
  56.                     110, 150, 150, 20, hwnd, (HMENU)CALE_NA_CM,
  57.                     hInstance, NULL);
  58.  
  59.                 CreateWindowEx(0, "EDIT", "0.00", WS_CHILD | WS_VISIBLE | WS_BORDER,
  60.                     110, 150, 180, 20, hwnd, (HMENU)TEXTBOX,
  61.                     hInstance, NULL);
  62.            
  63.                 CreateWindowEx(0, "STATIC", "0.00", WS_CHILD | WS_VISIBLE | WS_BORDER,
  64.                     110, 150, 150, 20, hwnd, (HMENU)STATICBOX,
  65.                     hInstance, NULL);
  66.                 // funkcja, która w podanym przedziale radiobuttonów (2 i 3 parametr) zaznacza tylko jeden ( ostatni parametr)
  67.                 CheckRadioButton(hwnd, CM_NA_CALE, CALE_NA_CM, CM_NA_CALE);//Początkowe zaznaczenie pierwszego radiobuttona.          
  68.             }break;
  69.  
  70.         case WM_COMMAND:
  71.             switch (LOWORD(wParam))//Uzyskanie ID klikniętej kontrolki.
  72.             {
  73.                 case CM_NA_CALE://Zaznaczenie pierwszego, odznaczenie drugiego radiobuttona:      
  74.                     CheckRadioButton(hwnd, CM_NA_CALE, CALE_NA_CM, CM_NA_CALE);        
  75.                     break;
  76.  
  77.                 case CALE_NA_CM://Zaznaczenie drugiego, odznaczenie pierwszego radiobuttona:
  78.                     CheckRadioButton(hwnd, CM_NA_CALE, CALE_NA_CM, CALE_NA_CM);
  79.                     break;
  80.             }
  81.             Przelicz();
  82.             break;
  83.  
  84.         case WM_SIZE:
  85.         {
  86.             RECT windowRect;
  87.             GetClientRect(hwnd, &windowRect);
  88.             int radiobutton_width = 155;
  89.             int radiobutton_x = (windowRect.right - radiobutton_width) / 2;
  90.             int radiobutton_y = windowRect.bottom / 2 - 50;
  91.  
  92.             int textbox_x = (windowRect.right - 2 * (BUTTON_WIDTH + 15)) / 2;
  93.             int textbox_y = windowRect.bottom / 2 - 10;
  94.  
  95.             //ustawiamy kontrolki w okienku
  96.             MoveWindow(GetDlgItem(hwnd,CM_NA_CALE), radiobutton_x, radiobutton_y, radiobutton_width, BUTTON_HEIGHT, TRUE);
  97.             MoveWindow(GetDlgItem(hwnd, CALE_NA_CM), radiobutton_x, radiobutton_y += 20, radiobutton_width, BUTTON_HEIGHT, TRUE);
  98.             MoveWindow(GetDlgItem(hwnd, TEXTBOX), textbox_x, textbox_y, BUTTON_WIDTH, BUTTON_HEIGHT, TRUE);
  99.             MoveWindow(GetDlgItem(hwnd, STATICBOX), textbox_x + BUTTON_WIDTH + 30, textbox_y, BUTTON_WIDTH, BUTTON_HEIGHT, TRUE);
  100.             HDC hdc = GetDC(hwnd);
  101.             TextOutA(hdc, textbox_x + BUTTON_WIDTH + 2, textbox_y + 2, "<=>", 3);
  102.             ReleaseDC(hwnd, hdc);
  103.         }break;
  104.  
  105.         case WM_CLOSE:
  106.             if( MessageBox(NULL, "Czy na pewno chcesz zamknąć okno?", "Pytanie", MB_ICONQUESTION | MB_OKCANCEL ) == IDOK)
  107.             DestroyWindow(hwnd);
  108.             break;
  109.  
  110.         case WM_DESTROY:
  111.             PostQuitMessage(0);
  112.             break;
  113.  
  114.         case WM_GETMINMAXINFO://Ustawianie minimalnego rozmiaru okna:
  115.             ((MINMAXINFO *)lParam)->ptMinTrackSize.x = WINDOW_WIDTH;
  116.             ((MINMAXINFO *)lParam)->ptMinTrackSize.y = WINDOW_HEIGHT;
  117.             break;
  118.  
  119.         default:
  120.             return DefWindowProc(hwnd, msg, wParam, lParam);
  121.     }
  122.     return 0;
  123. }
  124.  
  125. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR ilCmdLine, int nCmdShow)
  126. {
  127.     WNDCLASSEX window;
  128.     HWND hwnd = NULL;
  129.     MSG msg;
  130.     TCHAR ClassName[] = TEXT("KlasaOkna");
  131.     TCHAR WindowTitle[] = TEXT("Przeliczanie");
  132.  
  133.     window.cbClsExtra = NULL;
  134.     window.cbSize = sizeof(WNDCLASSEX);
  135.     window.cbWndExtra = NULL;
  136.     window.hbrBackground = (HBRUSH)(COLOR_WINDOW);
  137.     window.hCursor = LoadCursor(NULL, IDC_ARROW);
  138.     window.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  139.     window.hIconSm = NULL;
  140.     window.hInstance = hInstance;
  141.     window.lpfnWndProc = WndProc;
  142.     window.lpszClassName = ClassName;
  143.     window.lpszMenuName = 0;
  144.     window.style = CS_VREDRAW | CS_HREDRAW;
  145.  
  146.     RegisterClassEx(&window);
  147.  
  148.     hwnd = CreateWindowEx(WS_EX_WINDOWEDGE, ClassName, WindowTitle,
  149.              WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT,
  150.              WINDOW_HEIGHT, WINDOW_WIDTH, NULL, NULL, hInstance, NULL);
  151.  
  152.     ShowWindow(hwnd, nCmdShow);
  153.     UpdateWindow(hwnd);
  154.  
  155.     while (GetMessage(&msg, NULL, 0, 0))
  156.     {
  157.         TranslateMessage(&msg);
  158.         DispatchMessage(&msg);
  159.     }
  160.     UnregisterClass(ClassName, hInstance);
  161.     return msg.wParam;
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement