Создание программы с графическим интерфейсом на C++
с использованием WinAPI
Степень завершённости урока: 15%
В этом уроке создадим программу с графическим интерфейсом на C++ с использованием WinAPI в интегрированной среде разработки Microsoft Visual Studio 2022. Запустим эту программу.
Далее выберем в меню "Файл"->"Создать"->"Проект".
Visual Studio на выбор предложит огромное количество шаблонов, среди которых:
пустой проект
консольное приложение
проект CMake
мастер классических приложений Windows
классическое приложение Windows
пустое приложение на платформе UWP
приложение DirectX 11 и XAML
новое решение
библиотека динамической компоновки DLL
пустой проект CLR (.NET)
пустой проект CLR (.NET Framework)
консольное приложение CLR (.NET Framework)
статическая библиотека (LIB-файл)
проект общих элементов
проект ATL
библиотека классов CLR (.NET Framework)
проект Makefile
проект машинного модульного теста
Google Test
консольное приложение Windows (WinRT)
компонент среды выполнения Windows (WinRT)
пустое приложение (WinRT)
основное приложение (WinRT)
проект упаковки приложений Windows
приложение DirectX 11 (UWP)
приложение DirectX 12 (UWP)
приложение модульных тестов (для UWP с помощью MSTest)
библиотека DLL (UWP)
компонент среды выполнения Windows (UWP)
статическая библиотека (UWP, LIB-файл)
проект упаковки приложений Windows (C++, UWP)
проект упаковки приложений Windows (Visual Basic, UWP)
библиотека классов CLR (.NET)
пустое приложение, упакованное (C++, XAML, WinUI)
компонент среды выполнения Windows (C++, XAML, WinRT, UWP, WinUI)
пустое приложение, упакованное с помощью проекта упаковки приложений Windows (C++, XAML, WinUI)
библиотека динамической компоновки с экспортом (DLL)
проверка зависимостей
статическая библиотека (WinRT)
классическое приложение Windows (WinRT)
Я воспользуюсь шаблоном "классическое приложение Windows".
На следующем шаге необходимо выбрать название проекта и его расположение.
После завершения первоначальной настройки Visual Studio откроет код шаблона.
#include "framework.h"
#include "WindowsProject1.h"
#define MAX_LOADSTRING 100
HINSTANCE hInst;
WCHAR szTitle[MAX_LOADSTRING];
WCHAR szWindowClass[MAX_LOADSTRING];
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadStringW(hInstance, IDC_WINDOWSPROJECT1, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT1));
MSG msg;
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEXW wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT1));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT1);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassExW(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance;
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
Страница обновлена 19 января 2025 года.