Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Вы создали окно. Теперь вы хотите показать что-то внутри него. В терминологии 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 сведениями о запросе на перерисовку. Текущий регион обновления приведен в элементе rcPaint структуры PAINTSTRUCT. Этот регион обновления определяется относительно клиентской области:
В коде рисования есть два основных варианта:
- Покрасьте всю клиентную область независимо от размера региона обновления. Все, что выходит за пределы региона обновления, обрезается. То есть операционная система игнорирует ее.
- Оптимизация путем рисования только части окна в регионе обновления.
Если вы всегда красите всю клиентную область, код будет проще. Однако, если у вас сложная логика рисования, может быть более эффективно пропустить области вне региона обновления.
Следующая строка кода заполняет область обновления одним цветом, используя системный цвет фона окна (COLOR_WINDOW). Фактический цвет, указанный COLOR_WINDOW, зависит от текущей цветовой схемы пользователя.
FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
Сведения о FillRect не важны для этого примера, но второй параметр дает координаты прямоугольника для заполнения. В этом случае мы передаваем весь регион обновления (rcPaint член PAINTSTRUCT). На первом 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 о том, что окно завершило рисование.