WinAPI C: разработка для Windows на языке С
WinAPI - это набор функций и структур, предоставляемый операционной системой Windows для взаимодействия приложений с интерфейсом пользователя, файловыми системами, сетевыми протоколами и другими системными ресурсами. WinAPI предназначен для создания приложений под управлением Windows с использованием языков программирования высокого уровня, таких как C, C++, C#, Delphi и т.д.
Примеры кода на WinAPI C:
1. Создание окна:
#include
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
WNDCLASS wc = { 0 };
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = "MyWindowClass";
RegisterClass(&wc);
HWND hwnd = CreateWindow("MyWindowClass", "My Window", WS_OVERLAPPEDWINDOW,
100, 100, 500, 500, NULL, NULL, hInstance, NULL);
if (hwnd == NULL)
return 0;
ShowWindow(hwnd, nShowCmd);
MSG msg = { 0 };
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
Этот пример кода демонстрирует создание окна с использованием WinAPI C. Создание окна начинается с регистрации класса окна (WNDCLASS). Затем вызывается функция CreateWindow, которая создает новое окно. После того, как окно было создано и отображено, обрабатываются сообщения Windows с помощью цикла while, который вызывает функции GetMessage, TranslateMessage и DispatchMessage.
2. Работа с ресурсами:
#include
#include "resource.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
HWND hwnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, NULL);
ShowWindow(hwnd, nShowCmd);
MSG msg = { 0 };
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
if (!IsDialogMessage(hwnd, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
В этом примере кода используется функция CreateDialog, которая создает диалоговое окно из ресурса (в данном случае - IDD_DIALOG1). После того, как окно было создано и отображено, обрабатываются сообщения Windows с помощью цикла while, который вызывает функции GetMessage, IsDialogMessage, TranslateMessage и DispatchMessage.
3. Использование сообщений:
#include
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
WNDCLASS wc = { 0 };
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = "MyWindowClass";
RegisterClass(&wc);
HWND hwnd = CreateWindow("MyWindowClass", "My Window", WS_OVERLAPPEDWINDOW,
100, 100, 500, 500, NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nShowCmd);
MSG msg = { 0 };
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
RECT rc;
GetClientRect(hwnd, &rc);
DrawText(hdc, "Hello, WinAPI C!", -1, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
EndPaint(hwnd, &ps);
break;
}
case WM_KEYDOWN:
if (wParam == VK_ESCAPE) // ESC key
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
В этом примере кода используются сообщения Windows для реализации отрисовки текста и закрытия окна по нажатию клавиши. Сообщение WM_PAINT обрабатывается с помощью функции BeginPaint, которая создает контекст устройства рисования (HDC), и функции DrawText, которая рисует текст в клиентской области окна. WM_KEYDOWN обрабатывается с помощью простой логической проверки, после чего вызывается функция DestroyWindow для закрытия окна.