textpub.neocities.org . [ список статей ]

Мой перевод англоязычной статьи «Module 1. Your First Windows Program» с сайта компании Microsoft (ссылка на оригинал: новая, старая), автор статьи там не указан, дата публикации оригинала: 05.10.2010 г.

Простейшая программа
с оконным интерфейсом в Windows

В этой статье мы рассмотрим написание простейшей программы с оконным интерфейсом в 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);
}

Будет полезно дать краткое описание того, что этот код делает. В следующих статьях мы изучим его подробнее.

  1. Функция wWinMain является начальной точкой работы программы. В начале своей работы программа регистрирует некоторую информацию о поведении окна приложения. Одной из важных вещей здесь является адрес функции, названной WindowProc в этом примере. Эта функция определяет поведение окна — его внешний вид, как оно взаимодействует с пользователем и так далее;
  2. На следующем этапе программа создает окно и получает дескриптор для идентификации этого окна;
  3. Если окно создано успешно, программа входит в цикл while. Она остается в этом цикле до того момента, как пользователь закроет окно и выйдет из приложения.

Обратите внимание, что программа не вызывает явно функцию WindowProc, несмотря на то, что ранее было сказано, что в этой функции определена основная часть логики приложения. Windows общается с нашей программой посредством посылки ей серий сообщений. Программный код внутри цикла while управляет этим процессом. Каждый раз, когда программа вызывает функцию DispatchMessage, это косвенно становится причиной того, что Windows вызывает функцию WindowProc, по одному разу для каждого сообщения.

Статьи, в которых код этой программы рассматривается в подробностях:

textpub.neocities.org . [ список статей ]