напиши код на c++ visual studio проект приложения ...
Creado el: 16 de febrero de 2025
Creado el: 16 de febrero de 2025
напиши код на c++ visual studio проект приложения с графическим интерфейсом в windows для этого задания :В окне приложения расположены метка и кнопка. Одинарный щелчок левой клавишей мыши на метке приводит к смещению метки и кнопки на 20 пикселей вниз, а щелчок на кнопке – к смещению метки и кнопки на 20 пикселей влево
Ниже приведён пример минимального кода на чистом WinAPI (C++) для Visual Studio, демонстрирующий окно с меткой и кнопкой. При клике левой кнопкой мыши на метке элементы смещаются вниз на 20 пикселей, а при клике на кнопке — влево на 20 пикселей.
*.cpp
(например, main.cpp
) следующим кодом.main.cpp
cpp#include <windows.h> // Идентификаторы наших контролов: #define ID_LABEL 101 #define ID_BUTTON 102 // Глобальные переменные для хранения HWND контролов и их текущих координат HWND hLabel = nullptr; HWND hButton = nullptr; int labelX = 50; int labelY = 50; int buttonX = 50; int buttonY = 100; // Объявление функции оконной процедуры LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Точка входа в программу int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) { // 1. Регистрация класса окна WNDCLASSEX wc = { 0 }; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = NULL; wc.lpszClassName = L"SampleWindowClass"; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if (!RegisterClassEx(&wc)) { MessageBox(NULL, L"Не удалось зарегистрировать класс окна!", L"Ошибка", MB_ICONERROR); return -1; } // 2. Создание главного окна HWND hWnd = CreateWindowEx( 0, wc.lpszClassName, L"Пример приложения с меткой и кнопкой", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, // Размеры окна NULL, NULL, hInst, NULL ); if (!hWnd) { MessageBox(NULL, L"Не удалось создать окно!", L"Ошибка", MB_ICONERROR); return -1; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); // 3. Цикл обработки сообщений MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return static_cast<int>(msg.wParam); } // Функция оконной процедуры LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: { // Создаём статический текст (метку). // Важно: используем стиль SS_NOTIFY, чтобы получать сообщения о клике. hLabel = CreateWindowW( L"STATIC", // Класс контролла L"Метка", // Текст на метке WS_CHILD | WS_VISIBLE | SS_NOTIFY, labelX, labelY, // Начальные координаты (x,y) 100, 20, // Размеры hWnd, (HMENU)ID_LABEL, (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), NULL ); // Создаём кнопку hButton = CreateWindowW( L"BUTTON", // Класс контролла L"Кнопка", // Текст на кнопке WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, buttonX, buttonY, // Начальные координаты (x,y) 100, 30, // Размеры hWnd, (HMENU)ID_BUTTON, (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), NULL ); break; } case WM_COMMAND: { // Разбираем сообщение от контролов switch (LOWORD(wParam)) { case ID_LABEL: // Для статического текста приходит STN_CLICKED при SS_NOTIFY if (HIWORD(wParam) == STN_CLICKED) { // Смещаем метку и кнопку вниз на 20 px labelY += 20; buttonY += 20; // Устанавливаем новые координаты SetWindowPos(hLabel, NULL, labelX, labelY, 0, 0, SWP_NOSIZE | SWP_NOZORDER); SetWindowPos(hButton, NULL, buttonX, buttonY, 0, 0, SWP_NOSIZE | SWP_NOZORDER); } break; case ID_BUTTON: // Для кнопки приходит BN_CLICKED if (HIWORD(wParam) == BN_CLICKED) { // Смещаем метку и кнопку влево на 20 px labelX -= 20; buttonX -= 20; // Устанавливаем новые координаты SetWindowPos(hLabel, NULL, labelX, labelY, 0, 0, SWP_NOSIZE | SWP_NOZORDER); SetWindowPos(hButton, NULL, buttonX, buttonY, 0, 0, SWP_NOSIZE | SWP_NOZORDER); } break; } break; } case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
SS_NOTIFY
у статик-контрола (метки) необходим, чтобы он реагировал на клики мышью и генерировал сообщение STN_CLICKED
.WM_COMMAND
мы проверяем:
LOWORD(wParam)
),HIWORD(wParam)
).STN_CLICKED
; для кнопки — BN_CLICKED
.SetWindowPos
, чтобы изменить позицию контролов на форме.Скомпилируйте и запустите этот код. В результате вы получите окно с меткой и кнопкой: