Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

8.4.5 Закрашивание фона

Когда программа COLORS1 определяет свой класс окна, она задает для своей рабочей области сплошную черную кисть:

wndclass.hbrBackground = CreateSolidBrush(0L);

Если вы изменяете установки полос прокрутки программы COLORS1, то программа должна создать новую кисть и поместить в структуру класса окна новый описатель кисти. Точно также, как мы получали адрес прежней и вводили новую оконную процедуру полос прокрутки с помощью функций GetWindowLong и SetWindowLong, мы можем получить и ввести новый описатель этой кисти с помощью функций GetClassWord и SetClassWord.

Вы можете создать новую кисть, ввести ее описатель в структуру класса окна, а затем удалить старую кисть:

DeleteObject((HBRUSH)SetClassLong(hwnd,GCL_HBRBACKGROUND,

(LONG)CreateSolidBrush(RGB(color[0], color[1], color[2])));

Следующий раз Windows при перерисовке фона окна будет пользоваться новой кистью. Чтобы заставить Windows обновить фон, мы делаем недействительной правую половину рабочей области:

InvalidateRect(hwnd, &rcColor, TRUE);

Использования в качестве третьего параметра значения TRUE (не равно 0) показывает, что перед рисованием мы хотим обновить фон.

Функция InvalidateRect заставляет Windows поместить сообщение WM_PAINT в очередь сообщений оконной процедуры. Поскольку сообщения WM_PAINT имеют низкий приоритет, то такое сообщение, если вы еще перемещаете полосу прокрутки с помощью мыши или клавиш управления курсором, не будет обработано немедленно. В противном случае, если вы хотите, чтобы окно обновилось сразу после того, как его цвет был изменен, в программу, после вызова функции InvalidateRect необходимо добавить следующую инструкцию:

UpdateWindow(hwnd);

Но это может затормозить обработку сообщений клавиатуры и мыши.

Функция WndProc программы COLORS1 не обрабатывает сообщения WM_PAINT, а передает его в DefWindowProc. Заданный в Windows по умолчанию процесс обработки сообщений WM_PAINT заключается просто в вызовах функций BeginPaint и EndPaint, которые делают окно действительным. Поскольку мы задали при вызове функции InvalidateRect, что фон должен быть обновлен, то вызов функции BeginPaint заставляет Windows выработать сообщение WM_ERASEBKGND (обновление фона). WndProc игнорирует и это сообщение тоже. Windows обрабатывает его, обновляя фон рабочей области с помощью кисти, заданной в классе окна.

Считается хорошим стилем программирования удалять созданные ресурсы. Поэтому при обработке сообщения WM_DESTROY функция DeleteObject вызывается снова:

DeleteObject((HBRUSH)SetClassLong(hwnd, GCL_HBRBACKGROUND,(LONG) GetStockObject(WHITE_BRUSH)));

8.4.5 Окрашивание полос прокрутки и статического текста

В программе COLORS1 внутренние участки трех полос прокрутки и текст шести текстовых полей окрашиваются красным, зеленым и голубым цветами. Окрашивание полос прокрутки осуществляется путем обработки сообщений WM_CTLCOLORSCROLLBAR.

В WndProc мы для кистей определяем статический массив трех описателей:

static HBRUSH hBrush[3];

При обработке сообщения WM_CREATE мы создаем три кисти:

for(i = 0; i < 3; i++)

hBrush[i] = CreateSolidBrush(crPrim[i]);\

где в массиве crPrim хранятся RGB-значения трех первичных цветов. При обработке сообщений WM_CTLCOLORSCROLLBAR, возвращаемым значением оконной процедуры является одна из этих трех кистей:

case WM_CTLCOLORSCROLLBAR:

i = GetWindowLong((HWND) lParam, GWW_ID);

return(LRESULT) hBrush[i];

При обработке сообщения WM_DESTROY эти три кисти должны быть удалены:

for(i = 0; i < 3; DeleteObject(hBrush[i++]));

Аналогичным образом, путем обработки сообщения WM_CTLCOLORSTATIC и вызова функции SetTextColor, окрашивается текст в статических текстовых полях. Фон текста устанавливается функцией SetBkColor с системным цветом COLOR_BTNHIGHLIGHT. Это приводит к тому, что фон текста становится таким же, как цвет статического прямоугольника окна управления, который находится позади полос прокрутки и текста. Для статических дочерних текстовых окон управления этот цвет фона относится только к прямоугольнику позади каждого символа строки, а не ко всей ширине окна управления. Для того, чтобы это реализовать, оконная процедура должна также возвращать описатель кисти цвета COLOR_BTNHIGHLIGHT. Эта кисть называется hBrushStatic и создается при обработке сообщения WM_CREATE, а удаляется при обработке сообщения WM_DESTROY.

Создав, при обработке сообщения WM_CREATE, кисть на основе цвета COLOR_BTNHIGHLIGHT, и пользуясь ею на протяжении работы программы, мы создали себе маленькую проблему. Если во время работы программы цвет COLOR_BTNHIGHLIGHT изменяется, то изменится и цвет статического прямоугольника, а также цвет его текстового фона, однако весь фон текстового окна управления останется прежним — COLOR_BTNHIGHLIGHT.

Для решения этой проблемы в программе COLORS1 обрабатывается сообщение WM_SYSCOLORCHANGE путем простого повторного создания кисти hBrushStatic, использующей новый цвет.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]