Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Windows.h>
- #include <stdio.h>
- static const unsigned int WINDOW_WIDTH = 200;
- static const unsigned int WINDOW_HEIGHT = 100;
- static const unsigned int BUTTON_WIDTH = 70;
- static const unsigned int BUTTON_HEIGHT = 20;
- static const double PREDICTOR = 2.54;
- enum {CM_NA_CALE, CALE_NA_CM};
- HWND hWnd, Cm_na_Cale, Cale_na_Cm, textbox, staticbox; // uchwyty do okna i kontrolek
- void Przelicz()
- {
- const int len = (GetWindowTextLength(textbox)) % 10;
- char text[11];
- GetWindowTextA(textbox, text, len);
- // program rozpoznaje kropkę jako część ułamkową, dlatego zamieniamy przecinek jeśli go znajdziemy
- for(int i = 0; i < len; i++)
- if (text[i] == ',')
- {
- text[i] = '.';
- break;
- }
- // konwersja z tekstu na liczbę
- double value = atof(text);
- // jeśli centymetry na cale zaznaczone, to przeliczamy na cale
- if ((IsDlgButtonChecked(hWnd, CM_NA_CALE) == BST_CHECKED))
- value /= PREDICTOR; // dzielimy liczbę centymetrów przez jednostkową wartość cala w cm
- else
- value *= PREDICTOR; // dzielimy liczbę cali przez jednostkową wartość cala w cm
- // zamieniamy liczbę na tekst a następnie ją wpisujemy w polu statycznym
- sprintf_s(text, "%.2f", value);
- SetWindowTextA(staticbox, text);
- }
- LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
- {
- switch (msg)
- {
- case WM_CREATE:
- {
- hWnd = hwnd;
- //Dostanie się do hInstance wewnątrz WndProc bez deklarowania globalnej zmiennej.
- HINSTANCE &hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
- //Początkowe pozycje i tak nie są ważne - zostaną przesunięte w WM_SIZE
- Cm_na_Cale = CreateWindowEx(0, "BUTTON", "Centymetry na cale.", WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON,
- 10, 150, 150, 20, hwnd, (HMENU)CM_NA_CALE,
- hInstance, NULL);
- Cale_na_Cm = CreateWindowEx(0, "BUTTON", "Cale na centymetry.", WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON,
- 110, 150, 150, 20, hwnd, (HMENU)CALE_NA_CM,
- hInstance, NULL);
- textbox = CreateWindowEx(0, "EDIT", "0.00", WS_CHILD | WS_VISIBLE | WS_BORDER,
- 110, 150, 180, 20, hwnd, (HMENU)2,
- hInstance, NULL);
- staticbox = CreateWindowEx(0, "STATIC", "0.00", WS_CHILD | WS_VISIBLE | WS_BORDER,
- 110, 150, 150, 20, hwnd, (HMENU)3,
- hInstance, NULL);
- // funkcja, która w podanym przedziale radiobuttonów (2 i 3 parametr) zaznacza tylko jeden ( ostatni parametr)
- CheckRadioButton(hwnd, CM_NA_CALE, CALE_NA_CM, CM_NA_CALE);//Początkowe zaznaczenie pierwszego radiobuttona.
- }break;
- case WM_COMMAND:
- switch (LOWORD(wParam))//Uzyskanie ID klikniętej kontrolki.
- {
- case CM_NA_CALE://Zaznaczenie pierwszego, odznaczenie drugiego radiobuttona:
- CheckRadioButton(hwnd, CM_NA_CALE, CALE_NA_CM, CM_NA_CALE);
- break;
- case CALE_NA_CM://Zaznaczenie drugiego, odznaczenie pierwszego radiobuttona:
- CheckRadioButton(hwnd, CM_NA_CALE, CALE_NA_CM, CALE_NA_CM);
- break;
- }
- Przelicz();
- break;
- case WM_SIZE:
- {
- RECT windowRect;
- GetClientRect(hwnd, &windowRect);
- int radiobutton_width = 155;
- int radiobutton_x = (windowRect.right - radiobutton_width) / 2;
- int radiobutton_y = windowRect.bottom / 2 - 50;
- int textbox_x = (windowRect.right - 2 * (BUTTON_WIDTH + 15)) / 2;
- int textbox_y = windowRect.bottom / 2 - 10;
- //ustawiamy kontrolki w okienku
- MoveWindow(Cm_na_Cale, radiobutton_x, radiobutton_y, radiobutton_width, BUTTON_HEIGHT, TRUE);
- MoveWindow(Cale_na_Cm, radiobutton_x, radiobutton_y += 20, radiobutton_width, BUTTON_HEIGHT, TRUE);
- MoveWindow(textbox, textbox_x, textbox_y, BUTTON_WIDTH, BUTTON_HEIGHT, TRUE);
- MoveWindow(staticbox, textbox_x + BUTTON_WIDTH + 30, textbox_y, BUTTON_WIDTH, BUTTON_HEIGHT, TRUE);
- HDC hdc = GetDC(hwnd);
- TextOutA(hdc, textbox_x + BUTTON_WIDTH + 2, textbox_y + 2, "<=>", 3);
- ReleaseDC(hwnd, hdc);
- }break;
- case WM_CLOSE:
- if( MessageBox(NULL, "Czy na pewno chcesz zamknąć okno?", "Pytanie", MB_ICONQUESTION | MB_OKCANCEL ) == IDOK)
- DestroyWindow(hwnd);
- break;
- case WM_DESTROY:
- PostQuitMessage(0);
- break;
- case WM_GETMINMAXINFO://Ustawianie minimalnego rozmiaru okna:
- ((MINMAXINFO *)lParam)->ptMinTrackSize.x = WINDOW_WIDTH;
- ((MINMAXINFO *)lParam)->ptMinTrackSize.y = WINDOW_HEIGHT;
- break;
- default:
- return DefWindowProc(hwnd, msg, wParam, lParam);
- }
- return 0;
- }
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR ilCmdLine, int nCmdShow)
- {
- WNDCLASSEX window;
- HWND hwnd = NULL;
- MSG msg;
- TCHAR ClassName[] = TEXT("KlasaOkna");
- TCHAR WindowTitle[] = TEXT("Przeliczanie");
- window.cbClsExtra = NULL;
- window.cbSize = sizeof(WNDCLASSEX);
- window.cbWndExtra = NULL;
- window.hbrBackground = (HBRUSH)(COLOR_WINDOW);
- window.hCursor = LoadCursor(NULL, IDC_ARROW);
- window.hIcon = LoadIcon(NULL, IDI_APPLICATION);
- window.hIconSm = NULL;
- window.hInstance = hInstance;
- window.lpfnWndProc = WndProc;
- window.lpszClassName = ClassName;
- window.lpszMenuName = 0;
- window.style = CS_VREDRAW | CS_HREDRAW;
- RegisterClassEx(&window);
- hwnd = CreateWindowEx(WS_EX_WINDOWEDGE, ClassName, WindowTitle,
- WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT,
- WINDOW_HEIGHT, WINDOW_WIDTH, NULL, NULL, hInstance, NULL);
- ShowWindow(hwnd, nCmdShow);
- UpdateWindow(hwnd);
- while (GetMessage(&msg, NULL, 0, 0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- UnregisterClass(ClassName, hInstance);
- return msg.wParam;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement