Привет! С удовольствием расскажу тебе о том, как написать код на C WIN32 с подробными пояснениями для выполнения трёх задач.c
#include
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_PAINT⁚
{
PAINTSTRUCT ps;
HDC hdc BeginPaint(hwnd, nps);
HFONT hFont CreateFont(24, 0, 0, 0, FW_NORMAL, TRUE, FALSE, FALSE,
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_DONTCARE, L″Arial″);
HFONT hOldFont (HFONT)SelectObject(hdc, hFont);
SetTextColor(hdc, RGB(255, 0, 0)); // красный цвет текста
SetBkMode(hdc, TRANSPARENT);
SetTextAlign(hdc, TA_LEFT | TA_TOP);
TextOut(hdc, 10, 10, L″Иванов Иван Иванович″, wcslen(L″Иванов Иван Иванович″));
SelectObject(hdc, hOldFont);
DeleteObject(hFont);
EndPaint(hwnd, nps);
}
return 0;
// ... // Обработка других сообщений
// ... }
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// 1. Регистрация класса окна
WNDCLASS wc {};
wc.lpfnWndProc WindowProc;
wc.hInstance hInstance;
wc.lpszClassName L″MyWindowClass″;
RegisterClass(nwc);
// 2. Создание окна
HWND hwnd CreateWindowEx(
0, // дополнительные стили окна
wc.lpszClassName, // имя класса
L″Моё окно″, // заголовок окна
WS_OVERLAPPEDWINDOW, // стили окна
CW_USEDEFAULT, CW_USEDEFAULT, // позиция окна
CW_USEDEFAULT, CW_USEDEFAULT, // размеры окна
NULL, // родительское окно
NULL, // меню
hInstance, // дескриптор экземпляра приложения
NULL // дополнительные данные передаваемые в WM_CREATE
);
if (hwnd NULL)
{
return 0;
}
// 3. Отображение окна
ShowWindow(hwnd, nCmdShow);
// 4. Запуск цикла обработки сообщений
MSG msg {};
while (GetMessage(nmsg, NULL, 0, 0))
{
TranslateMessage(nmsg);
DispatchMessage(nmsg);
}
return msg.wParam;
}
c
#include
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
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 hOldPen (HPEN)SelectObject(hdc, hPen);
HBRUSH hOldBrush (HBRUSH)SelectObject(hdc, hBrush);
// Рисование круга
Ellipse(hdc, 10, 10, 40, 40);
// Рисование квадрата
Rectangle(hdc, 50, 10, 100, 60);
// Закраска внутри квадрата штриховкой⁚ полосы
HBRUSH hHatchBrush CreateHatchBrush(HS_HORIZONTAL, RGB(0, 0, 0)); // черная штриховка
HBRUSH hOldHatchBrush (HBRUSH)SelectObject(hdc, hHatchBrush);
Rectangle(hdc, 60, 20, 90, 50);
SelectObject(hdc, hOldHatchBrush);
DeleteObject(hHatchBrush);
SelectObject(hdc, hOldBrush);
SelectObject(hdc, hOldPen);
DeleteObject(hBrush);
DeleteObject(hPen);
EndPaint(hwnd, nps);
}
return 0;
// ... // Обработка других сообщений
// ... }
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// 1. Регистрация класса окна
WNDCLASS wc {};
wc.lpfnWndProc WindowProc;
wc.hInstance hInstance;
wc.lpszClassName L″MyWindowClass″;
RegisterClass(nwc);
// 2. Создание окна
HWND hwnd CreateWindowEx(
0٫ // дополнительные стили окна
wc.lpszClassName, // имя класса
L″Моё окно″, // заголовок окна
WS_OVERLAPPEDWINDOW, // стили окна
CW_USEDEFAULT, CW_USEDEFAULT, // позиция окна
CW_USEDEFAULT, CW_USEDEFAULT, // размеры окна
NULL, // родительское окно
NULL, // меню
hInstance, // дескриптор экземпляра приложения
NULL // дополнительные данные передаваемые в WM_CREATE
);
if (hwnd NULL)
{
return 0;
}
// 3. Отображение окна
ShowWindow(hwnd, nCmdShow);
// 4. Запуск цикла обработки сообщений
MSG msg {};
while (GetMessage(nmsg, NULL, 0, 0))
{
TranslateMessage(nmsg);
DispatchMessage(nmsg);
}
// 5. Сохранение в виде метафайла
HDC hdc GetDC(NULL);
HDC hdcMetafile CreateEnhMetaFile(hdc, L″output.emf″, NULL, NULL);
ReleaseDC(NULL, hdc);
if (hdcMetafile ! NULL)
{
RECT rect { 0, 0, 150, 100 }; // размеры метафайла
BeginPaint(hwnd, nps);
WindowProc(hwnd, WM_PAINT, 0٫ 0);
EndPaint(hwnd, nps);
HENHMETAFILE hMetafile CloseEnhMetaFile(hdcMetafile);
DeleteEnhMetaFile(hMetafile);
}
return msg.wParam;
}
c
#include
LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_PAINT⁚
{
PAINTSTRUCT ps;
HDC hdc BeginPaint(hwnd, nps);
// Загрузка изображения из ресурсов
HBITMAP hBitmap LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP1));
if (hBitmap ! NULL)
{
HDC hdcMemory CreateCompatibleDC(hdc);
HBITMAP hOldBitmap (HBITMAP)SelectObject(hdcMemory, hBitmap);
BITMAP bitmap;
GetObject(hBitmap, sizeof(bitmap), nbitmap);
BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMemory, 0, 0, SRCCOPY);
SelectObject(hdcMemory, hOldBitmap);
DeleteDC(hdcMemory);
DeleteObject(hBitmap);
}
EndPaint(hwnd, nps);
}
return 0;
// ... // Обработка других сообщений
// ... }
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG⁚
{
HWND hwndChild CreateWindowEx(
0٫
L″Static″,
NULL,
WS_CHILD | WS_VISIBLE | SS_BITMAP,
10,
10, 200,
200, hwndDlg,
NULL,
GetModuleHandle(NULL),
NULL
);
if (hwndChild ! NULL)
{
SendMessage(hwndChild, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)LoadImage(
GetModuleHandle(NULL),
MAKEINTRESOURCE(IDB_BITMAP2),
IMAGE_BITMAP,
0,
0,
LR_DEFAULTCOLOR
));
}
}
return (INT_PTR)TRUE;
// ... // Обработка других сообщений
// ... }
return (INT_PTR)FALSE;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// 1. Регистрация класса окна
WNDCLASS wc {};
wc.lpfnWndProc WindowProc;
wc.hInstance hInstance;
wc.lpszClassName L″MyWindowClass″;
RegisterClass(nwc);
// 2. Создание окна
HWND hwnd CreateWindowEx(
0٫ // дополнительные стили окна
wc.lpszClassName, // имя класса
L″Моё окно″, // заголовок окна
WS_OVERLAPPEDWINDOW, // стили окна
CW_USEDEFAULT, CW_USEDEFAULT, // позиция окна
CW_USEDEFAULT, CW_USEDEFAULT, // размеры окна
NULL, // родительское окно
NULL, // меню
hInstance, // дескриптор экземпляра приложения
NULL // дополнительные данные передаваемые в WM_CREATE
);
if (hwnd NULL)
{
return 0;
}
// 3. Отображение окна
ShowWindow(hwnd, nCmdShow);
// 4. Создание дочернего окна
HWND hwndChild CreateWindowEx(
0٫
L″MyWindowClass″,
L″Дочернее окно″,
WS_CHILD | WS_VISIBLE,
10,
10,
200,
200,
hwnd,
NULL,
hInstance,
NULL
);
if (hwndChild NULL)
{
return 0;
}
// 5. Создание диалогового окна
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1)٫ hwnd٫ DialogProc);
// 6. Запуск цикла обработки сообщений
MSG msg {};
while (GetMessage(nmsg, NULL, 0٫ 0))
{
TranslateMessage(nmsg);
DispatchMessage(nmsg);
}
return msg.wParam;
}
Этот код я написал, основываясь на своем опыте работы с WIN32 API и C . Надеюсь, что он окажется полезным для тебя!