Шрифт:
Здесь используются флаги окна, имеющие следующие значения:
• 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.
Листинг 2.29.
Удаление структуры ItemlDList
procedure DeletePIDL(pidl: 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;