Размер шрифта
-
+

Delphi. Трюки и эффекты - стр. 36

Обратите внимание на 16 квадратов в левой нижней области окна (рис. 2.4) – это места для определенных пользователем цветов. Для заполнения этой области окна и используются значения из массива colors. Массив может быть как локальным, так и глобальным (что удобнее, так как значения определенных пользователем цветов сохраняются между вызовами диалогового окна).

Окно выбора шрифта

Для вывода диалогового окна выбора шрифта вполне подойдет функция, приведенная в листинге 2.27.

Листинг 2.27. Окно выбора шрифта

function ShowChooseFont(var font: LOGFONT):BOOL;

var

choose: TChooseFont;

begin

ZeroMemory(Addr(choose), SizeOf(choose));

//Заполнение структуры для диалогового окна

choose.lStructSize := SizeOf(choose);

choose.hWndOwner := hParentWnd;

choose.hInstance := hAppInst;

choose.lpLogFont := Addr(font);

choose.Flags := CF_BOTH or CF_INITTOLOGFONTSTRUCT;

//Отображение окна диалога и обработка результата

if (ChooseFont(choose) = True) then

begin

CopyMemory(Addr(font), choose.lpLogFont, SizeOf(font));

ShowChooseFont := True;

end

else ShowChooseFont := False;

end;

Здесь используются флаги окна, имеющие следующие значения:

• CF_BOTH – отображать экранные и принтерные шрифты (для показа экранных или принтерных шрифтов можно использовать флаги CFSCREENFONTS и CF_PRINTERFONTS соответственно);

• CF_INITTOLOGFONTSTRUCT – выбрать в диалоговом окне шрифт, соответствующий (или максимально похожий) шрифту, описываемому структурой LOGFONT, указатель на которую сохраняется в поле lpLogFont.

Окно выбора папки

Чтобы иметь возможность пользоваться окном Обзор папок для выбора папки, можно использовать листинг 2.28.

Листинг 2.28. Окно выбора папки

function ShowChooseFolder(strTitle: string):string;

var

choose: BROWSEINFO;

buffer: string;

pidl: PItemIDList;

begin

ZeroMemory(Addr(choose), SizeOf(choose));

SetLength(buffer, MAX_PATH);

//Заполнение структуры для диалога

choose.hwndOwner := hParentWnd;

choose.pidlRoot := nil; //Корень – папка Рабочего стола

choose.pszDisplayName := PAnsiChar(buffer);

choose.lpszTitle := PAnsiChar(strTitle);

choose.ulFlags := 0;

//Вывод диалогового окна и обработка результата

pidl := SHBrowseForFolder(choose);

if (pidl <> nil) then

begin

//Получение полного пути выбранной папки

SHGetPathFromIDList(pidl, PAnsiChar(buffer));

ShowChooseFolder := buffer;

DeletePIDL(pidl);

end

else

ShowChooseFolder := '';

end;

В листинге 2.28 функция ShowChooseFolder возвращает полный путь указанной папки, если она выбрана, и пустую строку в противном случае. Само окно Обзор папок показано на рис. 2.5.

Рис. 2.5. Окно выбора папки


Особенностью использованной в данном примере функции SHBrowseForFolder является то, что она возвращает не путь выбранного каталога, а указатель на структуру ItemlDList (что-то вроде внутреннего представления путей). Для извлечения построения пути по содержимому этой структуры используется функция SHGetPathFromlDList. После этого структура нам больше не нужна, и ее следует правильно удалить (с использованием специального интерфейса IMalloc). Для этого используется процедура DeletePIDL, реализованная в листинге 2.29.

Страница 36