Чтение онлайн

на главную

Жанры

Шрифт:

Здесь дополнительно к упомянутому ранее флaгyOFN_PATHMUSTEXIST применен флаг OFN_OVERWRI ТЕ PROMPT для того, чтобы при указании имени уже существующего файла был задан вопрос о желании пользователя заменить старый файл.

Окно выбора цвета

Вызов следующего диалогового окна – окна выбора цвета – приводится в листинге 2.26.

...

Листинг 2.26.

Окно выбора цвета

function ShowChooseColor(lastColor: COLORREF = 0):COLORREF;

var

choose: TChooseColor;

begin

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

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

окна

choose.lStructSize := SizeOf(choose);

choose.hWndOwner := hParentWnd;

choose.hInstance := hAppInst;

choose.rgbResult := lastColor;

choose.lpCustColors := Addr(colors);

choose.Flags := CC_RGBINIT or CC_ANYCOLOR or CC_FULLOPEN;

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

if (ChooseColor(choose) = True) then ShowChooseColor :=

choose.rgbResult

else ShowChooseColor := lastColor;

end;

Здесь также заполняется структура похожего назначения. Используются следующие флаги диалогового окна:

• CC_RGBINIT – использовать значение поля rgbResult в качестве предустановленного значения цвета (по умолчанию как ранее выбранного);

• CC_ANYCOLOR – отображать все доступные предопределенные цвета (левая часть, рис. 2.4);

• CC_FULLOPEN – раскрывать панель подбора цвета (правая часть, рис. 2.4).

Рис. 2.4. Окно выбора цвета

Поясним, что за переменная, а точнее, ее адрес, сохраняется в поле lpCustColors – это массив из 16 значений типа COLORREF:

...

colors: array [1..16] of COLORREF;

Обратите внимание на 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.

...

Листинг 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

Амврелий Марк
2. Идущий в тени
Фантастика:
фэнтези
6.93
рейтинг книги
Идущий в тени. Книга 2

Сонный лекарь 4

Голд Джон
4. Не вывожу
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Сонный лекарь 4

Возрождение Феникса. Том 1

Володин Григорий Григорьевич
1. Возрождение Феникса
Фантастика:
фэнтези
попаданцы
альтернативная история
6.79
рейтинг книги
Возрождение Феникса. Том 1

Не грози Дубровскому!

Панарин Антон
1. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому!

Покоритель Звездных врат

Карелин Сергей Витальевич
1. Повелитель звездных врат
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Покоритель Звездных врат

Партиец

Семин Никита
2. Переломный век
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Партиец

Эффект Фостера

Аллен Селина
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Эффект Фостера

В теле пацана 4

Павлов Игорь Васильевич
4. Великое плато Вита
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
В теле пацана 4

Ваше Сиятельство 7

Моури Эрли
7. Ваше Сиятельство
Фантастика:
боевая фантастика
аниме
5.00
рейтинг книги
Ваше Сиятельство 7

Уязвимость

Рам Янка
Любовные романы:
современные любовные романы
7.44
рейтинг книги
Уязвимость

Мой любимый (не) медведь

Юнина Наталья
Любовные романы:
современные любовные романы
7.90
рейтинг книги
Мой любимый (не) медведь

Смертник из рода Валевских. Книга 1

Маханенко Василий Михайлович
1. Смертник из рода Валевских
Фантастика:
фэнтези
рпг
аниме
5.40
рейтинг книги
Смертник из рода Валевских. Книга 1

Бездомыш. Предземье

Рымин Андрей Олегович
3. К Вершине
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Бездомыш. Предземье

Пустоши

Сай Ярослав
1. Медорфенов
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Пустоши