end;
Каждый элемент массива styles хранит информацию об определенном оконном стиле. Объявление этого массива, так же, как структуры Stylelnfo и прочих рассмотренных в этом разделе типов данных, находится в модуле WindowData, расположенном на диске в папке с номером главы.
Ниже приведено объявление массива styles (флаги стиля, являющиеся комбинацией других флагов, в массив не попали) (листинг 10.7).
...
Листинг 10.7.
Массив с информацией об оконных стилях
styles: array [0..17] of StyleInfo =
(
(value: WS_BORDER; name: \'WS_BORDER\'),
(value: WS_CAPTION; name: \'WS_CAPTION\'),
(value: WS_CHILD; name: \'WS_CHILD\'),
(value: WS_CLIPCHILDREN; name: \'WS_CLIPCHILDREN\'),
(value: WS_DISABLED; name: \'WS_DISABLED\'),
(value: WS_DLGFRAME; name: \'WS_DLGFRAME\'),
(value: WS_HSCROLL; name: \'WS_HSCROLL\'),
(value: WS_MAXIMIZE; name: \'WS_MAXIMIZE\'),
(value: WS_MAXIMIZEBOX; name: \'WS_MAXIMIZEBOX\'),
(value: WS_MINIMIZE; name: \'WS_MINIMIZE\'),
(value: WS_MINIMIZEBOX; name: \'WS_MINIMIZEBOX\'),
(value: WS_OVERLAPPED; name: \'WS_OVERLAPPED\'),
(value: WS_POPUP; name: \'WS_POPUP\'),
(value: WS_SYSMENU; name: \'WS_SYSMENU\'),
(value: WS_TABSTOP; name: \'WS_TABSTOP\'),
(value: WS_THICKFRAME; name: \'WS_THICKFRAME\'),
(value: WS_VISIBLE; name: \'WS_VISIBLE\'),
(value: WS_VSCROLL; name: \'WS_VSCROLL\')
);
Процедура LoadWindowExStyle реализована практически так же, как и процедура LoadWindowStyle. Только она заполняет cnncKHlstExStyle HlstAvailExStyle и обращается к массиву exstyles, а не styles. Поэтому приведем объявление только массива exstyles (листинг 10.8).
...
Листинг 10.8.
Массив с информацией о дополнительных оконных стилях
exstyles: array [0..18] of StyleInfo =
(
(value: WS_EX_ACCEPTFILES; name: \'WS_EX_ACCEPTFILES\'),
(value: WS_EX_APPWINDOW; name: \'WS_EX_APPWINDOW\'),
(value: WS_EX_CLIENTEDGE; name: \'WS_EX_CLIENTEDGE\'),
(value: WS_EX_CONTEXTHELP; name: \'WS_EX_CONTEXTHELP\'),
(value: WS_EX_CONTROLPARENT; name: \'WS_EX_CONTROLPARENT\'),
(value: WS_EX_DLGMODALFRAME; name: \'WS_EX_DLGMODALFRAME\'),
(value: WS_EX_LAYERED; name: \'WS_EX_LAYERED\'),
(value: WS_EX_LEFT; name: \'WS_EX_LEFT\'),
(value: WS_EX_LEFTSCROLLBAR; name: \'WS_EX_LEFTSCROLLBAR\'),
(value: WS_EX_MDICHILD; name: \'WS_EX_MDICHILD\'),
(value: WS_EX_NOACTIVATE; name: \'WS_EX_NOACTIVATE\'),
(value: WS_EX_NOINHERITLAYOUT; name: \'WS_EX_NOINHERITLAYOUT\'),
(value: WS_EX_NOPARENTNOTIFY; name: \'WS_EX_NOPARENTNOTIFY\'),
(value: WS_EX_RIGHTSCROLLBAR; name: \'WS_EX_RIGHTSCROLLBAR\'),
(value: WS_EX_STATICEDGE; name: \'WS_EX_STATICEDGE\'),
(value: WS_EX_TOOLWINDOW; name: \'WS_EX_TOOLWINDOW\'),
(value: WS_EX_TOPMOST; name: \'WS_EX_TOPMOST\'),
(value: WS_EX_TRANSPARENT; name: \'WS_EX_TRANSPARENT\'),
(value: WS_EX_WINDOWEDGE; name: \'WS_EX_WINDOWEDGE\')
);
Изменение оконных стилей
Изменение стилей окна «на лету» производится не сложнее, чем их определение: с помощью API-функций GetWindowLong и SetWindowsLong. Пример добавления флага, обозначение которого выбрано в списке доступных стилей, приводится в листинге 10.9.
...
Листинг 10.9.
Добавление оконного стиля
procedure TfrmWindowProp.cmbAddStyleClick(Sender: TObject);
var
style: DWORD;
addstyle: DWORD;
begin
if lstAvailStyle.ItemIndex = –1 then Exit;
//Удаление выбранного стиля окна
//..определяем, какой стиль удалить
addstyle := styles[GetStyleIndex(lstAvailStyle.ItemIndex,
False)].value;
//..вычисляем и устанавливаем новое значение стиля окна
style := GetWindowLong(wnd, GWL_STYLE);
style := style or addstyle;
SetWindowLong(wnd, GWL_STYLE, style);
//..перерисуем все окна
InvalidateRect(0, nil, True);
//Обновим список стилей окна
LoadWindowStyle();
end;
Удаление флага стиля производится аналогично добавлению, просто над битами стиля окна выполняется другая операция (листинг 10.10).
...
Листинг 10.10.
Удаление оконного стиля
procedure TfrmWindowProp.cmbDelStyleClick(Sender: TObject);
var
style: DWORD;
delstyle: DWORD;
begin
if lstStyle.ItemIndex = –1 then Exit;
//Удаление выбранного стиля окна
//..определяем, какой стиль удалить
delstyle := styles[GetStyleIndex(lstStyle.ItemIndex, True)].value;
//..вычисляем и устанавливаем новое значение стиля окна
style := GetWindowLong(wnd, GWL_STYLE);
style := style and not delstyle;
SetWindowLong(wnd, GWL_STYLE, style);
//..перерисуем все окна
InvalidateRect(0, nil, True);
//Обновим список стилей окна
LoadWindowStyle();
end;
После удаления или добавления оконного стиля вызывается перерисовка всех окон, чтобы проявился результат проведенной операции. Удаление и добавление дополнительных (расширенных) оконных стилей осуществляется аналогично. Только при этом используются массив exstyles, функция GetExStylelndex и константа GWL_EXSTYLE, передаваемая в функции GetWindowLongи SetWindowLong.
Что же за функция GetStylelndex используется в листинге 10.10? Она позволяет определить положение в массиве styles стиля, выбранного в списке доступных или используемых стилей (верхний список) (листинг 10.11).
Читать дальше
Конец ознакомительного отрывка
Купить книгу