Advertisement
Guest User

Win\

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