Привет! Я хочу поделиться с тобой своим опытом написания кода на C для WIN32 с подробными пояснениями. Давай начинать!cpp
#include
#include
// Прототипы функций окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
// Главная функция
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// Регистрация класса окна
const TCHAR className[] _T(″MyWindowClass″);
WNDCLASSEX wcex {sizeof(WNDCLASSEX)};
wcex.style CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc WndProc;
wcex.hInstance hInstance;
wcex.hCursor LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground (HBRUSH)(COLOR_WINDOW 1);
wcex.lpszClassName className;
if (!RegisterClassEx(nwcex))
{
MessageBox(nullptr, _T(″Ошибка регистрации класса окна″), _T(″Ошибка″), MB_ICONERROR);
return 1;
}
// Создание окна
HWND hWnd CreateWindow(
className,
_T(″Мое окно″),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
800, 600, nullptr,
nullptr,
hInstance,
nullptr);
if (!hWnd)
{
MessageBox(nullptr, _T(″Ошибка создания окна″), _T(″Ошибка″), MB_ICONERROR);
return 2;
}
// Отображение окна
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// Основной цикл обработки сообщений
MSG msg;
while (GetMessage(nmsg, nullptr, 0, 0))
{
TranslateMessage(nmsg);
DispatchMessage(nmsg);
}
return (int)msg.wParam;
}
// Функция обработки сообщений окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_PAINT⁚
{
// Создание контекста устройства
PAINTSTRUCT ps;
HDC hdc BeginPaint(hWnd, nps);
// Задание параметров текста
HFONT hFont CreateFont(
24, 0, 0, 0,
FW_NORMAL, FALSE, FALSE, FALSE,
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_DONTCARE,
_T(″Arial″));
// Выбор шрифта и цвета
HFONT hPrevFont (HFONT)SelectObject(hdc, hFont);
SetTextColor(hdc, RGB(255, 0, 0));
SetBkMode(hdc, TRANSPARENT);
SetTextAlign(hdc, TA_LEFT);
RECT rect;
GetClientRect(hWnd, nrect);
DrawText(hdc, _T(″Иванов Иван Иванович″), -1, nrect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
// Очистка ресурсов
SelectObject(hdc, hPrevFont);
DeleteObject(hFont);
EndPaint(hWnd, nps);
break;
}
case WM_DESTROY⁚
{
PostQuitMessage(0);
break;
}
default⁚
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
Первая часть кода отвечает за создание окна и его отображение. Мы регистрируем класс окна, создаем окно и запускаем основной цикл обработки сообщений.
Вторая часть кода отвечает за вывод текста в окно. В функции `WndProc`, которая обрабатывает сообщения окна, мы добавляем обработку сообщения `WM_PAINT`. Внутри этого обработчика мы создаем контекст устройства `HDC`, задаем параметры текста (шрифт, цвет текста, фон) и выводим нужный текст в окно с помощью функции `DrawText`.cpp
#include
// Прототипы функций окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
// Главная функция
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// Регистрация класса окна
const TCHAR className[] _T(″MyWindowClass″);
WNDCLASSEX wcex {sizeof(WNDCLASSEX)};
wcex.style CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc WndProc;
wcex.hInstance hInstance;
wcex.hCursor LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground (HBRUSH)(COLOR_WINDOW 1);
wcex.lpszClassName className;
if (!RegisterClassEx(nwcex))
{
MessageBox(nullptr, _T(″Ошибка регистрации класса окна″), _T(″Ошибка″), MB_ICONERROR);
return 1;
}
// Создание окна
HWND hWnd CreateWindow(
className,
_T(″Мое окно″),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
800, 600,
nullptr,
nullptr,
hInstance,
nullptr);
if (!hWnd)
{
MessageBox(nullptr, _T(″Ошибка создания окна″), _T(″Ошибка″), MB_ICONERROR);
return 2;
}
// Отображение окна
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// Основной цикл обработки сообщений
MSG msg;
while (GetMessage(nmsg, nullptr, 0, 0))
{
TranslateMessage(nmsg);
DispatchMessage(nmsg);
}
return (int)msg.wParam;
}
// Функция обработки сообщений окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_PAINT⁚
{
// Создание контекста устройства
PAINTSTRUCT ps;
HDC hdc BeginPaint(hWnd, nps);
// Задание параметров пера
HPEN hPen CreatePen(PS_SOLID, 2, RGB(0, 255, 0));
HBRUSH hBrush CreateSolidBrush(RGB(255٫ 0٫ 0));
// Выбор пера и кисти
HPEN hPrevPen (HPEN)SelectObject(hdc, hPen);
HBRUSH hPrevBrush (HBRUSH)SelectObject(hdc, hBrush);
Ellipse(hdc, 100, 100, 130, 130); // круг
Rectangle(hdc, 150, 100, 200, 150); // квадрат
// Задание параметров для штриховки
HPEN hDottedPen CreatePen(PS_DOT, 1, RGB(0, 0, 0));
HBRUSH hHatchBrush CreateHatchBrush(HS_BDIAGONAL, RGB(0, 0, 0));
// Выбор штрихованного пера и кисти
SelectObject(hdc, hDottedPen);
SelectObject(hdc, hHatchBrush);
Rectangle(hdc, 150, 100, 200, 150);
// Очистка ресурсов
SelectObject(hdc, hPrevPen);
SelectObject(hdc, hPrevBrush);
DeleteObject(hPen);
DeleteObject(hBrush);
DeleteObject(hDottedPen);
DeleteObject(hHatchBrush);
EndPaint(hWnd, nps);
break;
}
case WM_DESTROY⁚
{
PostQuitMessage(0);
break;
}
default⁚
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
В этом примере мы также используем функцию `WndProc` для обработки сообщений окна. Здесь мы добавляем обработку сообщения `WM_PAINT`, создаем контекст устройства `HDC` и задаем параметры пера и кисти. Затем мы выводим круг и квадрат на окно с помощью функций `Ellipse` и `Rectangle`. Также мы задаем параметры для штрихования и выводим штрихованный квадрат с помощью функции `Rectangle` еще раз.cpp
#include
#include
// Прототипы функций окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
// Главная функция
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// Регистрация класса окна
const TCHAR className[] _T(″MyWindowClass″);
WNDCLASSEX wcex {sizeof(WNDCLASSEX)};
wcex.style CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc WndProc;
wcex.hInstance hInstance;
wcex.hCursor LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground (HBRUSH)(COLOR_WINDOW 1);
wcex.lpszClassName className;
if (!RegisterClassEx(nwcex))
{
MessageBox(nullptr, _T(″Ошибка регистрации класса окна″), _T(″Ошибка″), MB_ICONERROR);
return 1;
}
// Создание окна
HWND hWnd CreateWindow(
className,
_T(″Мое окно″),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
800٫ 600٫
nullptr,
nullptr,
hInstance,
nullptr);
if (!hWnd)
{
MessageBox(nullptr, _T(″Ошибка создания окна″), _T(″Ошибка″), MB_ICONERROR);
return 2;
}
// Отображение окна
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// Основной цикл обработки сообщений
MSG msg;
while (GetMessage(nmsg, nullptr, 0, 0))
{
TranslateMessage(nmsg);
DispatchMessage(nmsg);
}
return (int)msg.wParam;
}
// Функция обработки сообщений окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_PAINT⁚
{
// Создание контекста устройства
PAINTSTRUCT ps;
HDC hdc BeginPaint(hWnd, nps);
// Загрузка графического изображения из ресурсов
HBITMAP hBitmap LoadBitmap(GetModuleHandle(nullptr), MAKEINTRESOURCE(IDB_BITMAP1));
// Проверка на успешную загрузку графического изображения
if (hBitmap ! nullptr)
{
// Создание контекста устройства для графического изображения
HDC hdcMem CreateCompatibleDC(hdc);
HBITMAP hOldBitmap (HBITMAP)SelectObject(hdcMem, hBitmap);
BitBlt(hdc, 100, 100, 200, 200, hdcMem, 0, 0, SRCCOPY);
// Очистка ресурсов
SelectObject(hdcMem, hOldBitmap);
DeleteDC(hdcMem);
DeleteObject(hBitmap);
}
EndPaint(hWnd, nps);
break;
}
case WM_DESTROY⁚
{
PostQuitMessage(0);
break;
}
default⁚
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
В этом примере мы также добавляем обработку сообщения `WM_PAINT` в функции `WndProc`. Мы используем функцию `LoadBitmap` для загрузки графического изображения из ресурсов (в данном случае из IDB_BITMAP1). Затем мы создаем контекст устройства `HDC` для графического изображения, выводим его на окно с помощью функции `BitBlt` и очищаем ресурсы.
Эти примеры демонстрируют различные возможности по выводу текста и графических изображений в окно на C с использованием WIN32. Надеюсь, они окажутся полезными для тебя при разработке своих программ!