Delphi. Трюки и эффекты - стр. 36
Обратите внимание на 16 квадратов в левой нижней области окна (рис. 2.4) – это места для определенных пользователем цветов. Для заполнения этой области окна и используются значения из массива colors. Массив может быть как локальным, так и глобальным (что удобнее, так как значения определенных пользователем цветов сохраняются между вызовами диалогового окна).
Окно выбора шрифта
Для вывода диалогового окна выбора шрифта вполне подойдет функция, приведенная в листинге 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.
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.