Окно выбора шрифта
Для вывода диалогового окна выбора шрифта вполне подойдет функция, приведенная в листинге 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;
pidclass="underline" 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.
...Листинг 2.29.
Удаление структуры ItemlDList
procedure DeletePIDL(pidclass="underline" PItemIDList);
var
pMalloc: IMalloc;
begin
SHGetMalloc(pMalloc);
if (pMalloc <> nil) then
begin
pMalloc.Free(pidl);
pMalloc._Release();
end;
end;
...Примечание
Освобождение памяти, занимаемой данными структуры ItemlDList, можно выполнить и более простым способом: использовать API-функцию CoTaskMemFree, передав ей адрес структуры в качестве следующего параметра: CoTaskMemFree(pidl).
Вообще функцию SHBrowseForFolder (листинг 2.28) можно использовать и для указания принтеров или компьютеров. Для этого достаточно установить флаги BIF_BROWSEFORCOMPUTERH BIF_BROWSEFORPRINTER соответственно:
...choose.ulFlags := BIF_BROWSEFORCOMPUTER;
или
...choose.ulFlags := BIF_BROWSEFORPRINTER;
Чтобы в окне отображались еще и значки файлов, необходимо установить флаг BIF_BROWSEINCLUDEFILES.
Окна подключения и отключения сетевого ресурса
Часто бывает удобно осуществлять доступ к сетевым папкам как к локальным дискам компьютера (с использованием того же принципа построения пути). Окна подключения и отключения сетевого ресурса позволяют дать пользователю возможность выбрать, какие папки считать сетевыми дисками и какие сетевые диски можно отключить.
Окно подключения сетевого ресурса в Windows ХР выглядит так, как показано на рис. 2.6.
Рис. 2.6. Окно подключения сетевого диска
Для вызова диалогового окна подключения сетевого ресурса можно использовать функцию, приведенную в листинге 2.30.
...Листинг 2.30.
Окно подключения сетевого ресурса
function ShowConnection(): BOOL;
begin
ShowConnection :=
WNetConnectionDialog(hParentWnd, RESOURCETYPE_DISK) = NO_ERROR;
end;
Функция ShowConnection возвращает True в случае удачного подключения и False в противном случае.
Окно отключения сетевого диска приведено на рис. 2.7.
Рис. 2.7. Отключение сетевого ресурса
Функция, показывающая окно отключения сетевого диска, приведена в листинге 2.31.
...Листинг 2.31.
Окно отключения сетевого ресурса
function ShowDisconnect(): BOOL;
begin
ShowDisconnect :=
WNetDisconnectDialog(hParentWnd, RESOURCETYPE_DISK) = NO_ERROR;
end;
Аналогично ShowConnection функция ShowDisconnect возвращает True, если отсоединен хотя бы один диск, и False в противном случае.
Системное окно «О программе»
Этот последний и довольно экзотичный пример приведен на случай, если возникнет желание или необходимость использовать красивое окно О программе, которое выводится для самой операционной системы Windows и ее компонентов. Процедура выведения этого окна приведена в листинге 2.32.
...Листинг 2.32.
Окно «О программе»
procedure ShowAbout(strAppName: string; strInfo: string);
begin
ShellAbout(hParentWnd, PAnsiChar(strAppName),
PAnsiChar(strInfo),LoadIcon(0, IDI_ASTERISK));
end;
Правда, в окне О программе Windows ХР на информацию о приложении отведено всего две строки (и место для значка слева от окна). Все остальное место занимают информация о регистрации операционной системы и фирменная эмблема Microsoft Windows ХР.
Демонстрационное приложение
Теперь пришла очередь рассмотреть небольшое приложение, использующее описанные выше диалоговые окна (проект StandartWindows). Окно этого приложения приводится на рис. 2.8.