textpub.neocities.org . [ список статей ]
Мой перевод англоязычной статьи «Module 1. Your First Windows Program» с сайта компании Microsoft (ссылка на оригинал: новая, старая), автор статьи там не указан, дата публикации оригинала: 05.10.2010 г.
В этой статье мы рассмотрим написание простейшей программы с оконным интерфейсом в Windows. Всё, что она должна будет сделать, это создать и открыть пустое окно. Эта программа будет содержать около 50 строк кода, не считая пустых строк и комментариев. Эта программа станет нашей отправной точкой; позже мы добавим графику, текст, поля ввода и другие элементы пользовательского интерфейса.
Вот полный текст программы:
#ifndef UNICODE #define UNICODE #endif #include <windows.h> LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow) { // Регистрируем класс окна const wchar_t CLASS_NAME[] = L"Класс простого окна"; WNDCLASS wc = { }; wc.lpfnWndProc = WindowProc; wc.hInstance = hInstance; wc.lpszClassName = CLASS_NAME; RegisterClass(&wc); // Создаем окно HWND hwnd = CreateWindowEx( 0, // Дополнительные стили окна CLASS_NAME, // Класс окна L"Программирование в Windows", // Текст заголовка окна WS_OVERLAPPEDWINDOW, // Стиль окна // Размеры и позиция на экране CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, // Окно-родитель NULL, // Меню hInstance, // Дескриптор экземпляра приложения NULL // Дополнительные данные приложения ); if (hwnd == NULL) { return 0; } ShowWindow(hwnd, nCmdShow); // Запускаем цикл сообщений MSG msg = { }; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1)); EndPaint(hwnd, &ps); } return 0; } return DefWindowProc(hwnd, uMsg, wParam, lParam); }
Будет полезно дать краткое описание того, что этот код делает. В следующих статьях мы изучим его подробнее.
Обратите внимание, что программа не вызывает явно функцию WindowProc, несмотря на то, что ранее было сказано, что в этой функции определена основная часть логики приложения. Windows общается с нашей программой посредством посылки ей серий сообщений. Программный код внутри цикла while управляет этим процессом. Каждый раз, когда программа вызывает функцию DispatchMessage, это косвенно становится причиной того, что Windows вызывает функцию WindowProc, по одному разу для каждого сообщения.
Статьи, в которых код этой программы рассматривается в подробностях: