Поделиться через


Рисование окна

Вы создали окно. Теперь вы хотите показать что-то внутри него. В терминологии Windows это называется рисованием окна. Чтобы смешать метафоры, окно — это пустой холст, ожидающий, когда вы его заполните.

Иногда программа инициирует рисование, чтобы обновить внешний вид окна. В других случаях операционная система уведомит вас о том, что необходимо перекрасить часть окна. В этом случае операционная система отправляет окну WM_PAINT сообщение. Часть окна, которую необходимо закрасить, называется областью обновления.

При первом отображении окна вся клиентская область окна должна быть окрашена. Поэтому при показе окна вы всегда будете получать по крайней мере одно WM_PAINT сообщение.

иллюстрация, показывающая область обновления окна

Вы несете ответственность только за рисование клиентской области. Окружающий кадр, включая заголовок окна, автоматически закрашивался операционной системой. Завершив рисование клиентской области, вы очистите регион обновления, который сообщает операционной системе, что ей не нужно отправлять другое сообщение WM_PAINT , пока что-то не изменится.

Теперь предположим, что пользователь перемещает другое окно, чтобы оно заслоняет часть окна. Когда скрытая часть снова становится видимой, эта часть добавляется в область обновления, и окно получает еще одно сообщение WM_PAINT .

Иллюстрация, показывающая, как изменяется область обновления при перекрытии двух окон

Регион обновления также изменяется, если пользователь растягивает окно. На следующей схеме пользователь растягивает окно вправо. Вновь предоставленная область в правой части окна добавляется в область обновления:

Иллюстрация, показывающая, как изменяется область обновления при изменении размера окна

В нашем первом примере программа рисования очень проста. Он просто заполняет всю клиентская область сплошным цветом. Тем не менее, этого примера достаточно, чтобы продемонстрировать некоторые важные понятия.

switch (uMsg)
{
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);

        // All painting occurs here, between BeginPaint and EndPaint.

        FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));

        EndPaint(hwnd, &ps);
    }
    return 0;
}

Запустите операцию рисования, вызвав функцию BeginPaint . Эта функция заполняет структуру PAINTSTRUCT сведениями о запросе на перерисовку. Текущая область обновления указана в элементе rcPaintpaintSTRUCT. Этот регион обновления определяется относительно клиентской области:

Иллюстрация, показывающая источник клиентской области

В коде рисования есть два основных варианта:

  • Рисование всей клиентской области независимо от размера региона обновления. Все, что находится за пределами области обновления, обрезается. То есть операционная система игнорирует его.
  • Оптимизируйте, рисуя только часть окна в области обновления.

Если вы всегда рисуете всю клиентную область, код будет проще. Однако при наличии сложной логики рисования может быть эффективнее пропустить области за пределами региона обновления.

В следующей строке кода область обновления заполняется одним цветом, используя определенный системой цвет фона окна (COLOR_WINDOW). Фактический цвет, указанный COLOR_WINDOW , зависит от текущей цветовой схемы пользователя.

FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));

Сведения о FillRect не важны для этого примера, но второй параметр дает координаты прямоугольника для заполнения. В этом случае мы передаем весь регион обновления (член rcPaintPAINTSTRUCT). В первом сообщении WM_PAINT должна быть закрашена вся клиентская область, поэтому rcPaint будет содержать всю клиентную область. В последующих сообщениях WM_PAINTrcPaint может содержать прямоугольник меньшего размера.

Функция FillRect является частью интерфейса графических устройств (GDI), который использует графику Windows в течение очень длительного времени. В Windows 7 корпорация Майкрософт представила новый графический механизм с именем Direct2D, который поддерживает высокопроизводительные графические операции, такие как аппаратное ускорение. Direct2D также доступен для Windows Vista через Обновление платформы для Windows Vista и для Windows Server 2008 через Обновление платформы для Windows Server 2008. (GDI по-прежнему полностью поддерживается.)

Завершив рисование, вызовите функцию EndPaint . Эта функция очищает область обновления, которая сообщает Windows о том, что окно завершило рисование.

Следующая

Закрытие окна