Создание программы с графическим интерфейсом на 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 года.