- •Часть 2 (продолжение): Прикладное программирование в Windows
- •Глава 8. Виртуальное окно: работа с текстом
- •8.1. Оконные координаты, цвета, отображение строк
- •Кодировка rgb-значений
- •Размеры системных метрик
- •8.2. Виртуальное окно
- •Способы заполнения прямоугольной области
- •8.3. Изменение шрифтов
- •Макроимена распространенных шрифтов
- •8.4. Создание собственных шрифтов
- •Глава 9. Программирование графики
- •9.1. Логическая система координат
- •Рекомендуемый самый яркий состав цветов
- •9.2. Пиксели, линии, дуги, прямоугольники, эллипсы и секторы
- •9.3. Работа с перьями и кистями
- •Типы линий, создаваемых пером
- •9.4. Технология виртуального окна
- •9.5. Режимы отображения и области вывода
- •Текущий режим отображения (mappind mode)
- •Глава 10. Работа с панелями инструментов
- •10.1. Общие элементы управления
- •Общие элементы управления
- •10.2. Подключение и инициализация общих элементов управления
- •10.3. Работа с панелью инструментов
- •Начальные состояния кнопок панели инструментов
- •Стиль кнопки определяется (значения поля fsStyle)
- •Сообщения к панели инструментов
- •10.4. Создание растрового изображения для панели инструментов
- •10.5. Включение подсказок
- •Глава 11. Спины, ползунки и индикаторы процессов
- •11.1. Работа со спином
- •Стили «up-down control»
- •Сообщения, которые можно посылать спину
- •11.2. Создание спина с «приятельским» окном
- •11.3. Работа с ползунком
- •Значения стилей для ползунка
- •Перечень сообщений, которые можно посылать ползунку
- •Перечень нотификационных сообщения ползунка
- •11.4. Индикатор процесса
- •Управляющие сообщения индикатору
- •Глава 12. Многозадачность: процессы и потоки
- •12.1. Создание нового процесса (отдельной задачи)
- •Разрешенные значения поля dwFlags
- •12.2. Многопотоковые программы
- •12.3. Работа с несколькими потоками
- •12.4. Синхронизация процессов и потоков: семафоры
- •12.5. Обработка событий
- •Глава 13. Приемы программного управления вычислительным процессом
- •13.1. Использование функций Проводника Explorer для работы в файловой системе
- •Управляющая информация Проводника
- •Режимы обработки файлов
- •13.2. Создание собственных динамических библиотек (dll-файлов)
- •13.3. Работа с буфером обмена Clipboard
- •Функции подсистемы Clipboard
- •Свойства выделяемого блока памяти
- •Форматы и типы данных
- •Литература
Глава 13. Приемы программного управления вычислительным процессом
13.1. Использование функций Проводника Explorer для работы в файловой системе
Одной из основных программных компонент для управления файлами является Проводник (Explorer). Операционная система обеспечивает его множеством функций, часть из которых по определенным соображениям доступна только в режиме Администратора.
Рассмотрим эти функции на пример получения доступа к файлам в файловой системе для следующих целей:
1) функция GetOpenFileName() – найти файл, открыть и обработать;
2) функция GetSaveOpenFileName() – найти папку для размещения файла и сохранения его под каким-то именем*.
Другие функции Вы сможете изучить либо в HELP-подсистеме Developer Studio, либо с помощью пакета MSDN для профессиональных разработчиков Windows-приложений.
Функция GetOpenFileName() создает системно-зависимый диалог (dialog box), который позволяет пользователю программы выбрать файл для открытия. Функция имеет следующий вид:
BOOL GetOpenFileName(LPOPENFILENAME lpofn);
Параметр lpofn является указателем на структуру OPENFILENAME, которая содержит управляющую информацию, используемую для инициализации диалогового окна Проводника. Наиболее часто используемые поля OPENFILENAME приведены в таблице 13.1.
Таблица 13.1
Управляющая информация Проводника
№ |
Поле OPENFILENAME |
Содержимое |
1 |
lStructSize |
Размер структуры (байт) |
2 |
hwndOwner |
Идентифицирует окно, соответствующее данному диалогу |
3 |
lpstrFilter |
Указатель на строку, где содержатся суффиксы – фильтры для ускоренного просмотра. Если суффиксов несколько, то между ними устанавливается разделитель – нулевой символ, а в конце строки расположены два нулевых символа. Соответствующая информация обычно указывается в файле ресурсов программы (например, "*.TXT *.DOC *.BAK"). Эти суффиксы должны разделяться символом « | », а вся строка заканчиваться нулевым символом |
4 |
nFilterIndex |
Показывает индекс конкретного суффикса – фильтра в строке lpstrFilter. Обычно это первый фильтр, поэтому указывают значение 1 |
5 |
lpstrFile |
Указывает на буферную строку, которая содержит имя файла. При использовании функцииGetOpenFileName или GetSaveFileName в этот буфер проводник поместит значения полного пути: от накопителя информации до имени файла в папке (включительно) |
6 |
nMaxFile |
Определяет размер буферной строки, на которую указывает поле lpstrFile (не менее 256 байт). Если эта строка мала, то функция GetOpenFileName() илиGetSaveFileName() выдаст значение FALSE |
7 |
lpstrFileTitle |
Указывает на буферную строку, куда будет помещен заголовок файла без полного пути |
8 |
nMaxFileTitle |
Указывает на максимальную длину буферной строки, куда помещается заголовок файла. Если lpstrFileTitleравен NULL, то параметр игнорируется |
9 |
lpstrTitle |
Указывает на строку с названием диалогового окна проводника. Если это поле равно NULL, то система использует свои названия по умолчанию (типа «Сохранить как» или «Открыть») |
10 |
lpstrInitialDir |
Указывает на строку, где содержится точка начала поиска в файловой системе (конкретная папка или др.) Если поле равно NULL, система начинает работу с текущей папки |
11 |
Flags |
Флаги, облегчающие работу с функциями Проводника: OFN_SHOWHELP – помещает в главное меню окна диалога кнопку Help; OFN_PATHMUSTEXIST – обеспечивает контроль правильности действий при указании имени файла и пути к нему во время работы. Проводник делает предупреждения, если пользователь указывает неправильные имена файлов или пути к ним; OFN_FILEMUSTEXIST – обеспечивает контроль правильности действий при указании имени файла. Проводник делает предупреждения, если пользователь указывает неправильные имена файлов |
Если в программе при выполнении функции GetOpenFileName или GetSaveFileName нет ошибок, то соответствующая функция возвращает значение TRUE.
Технология работы с Проводником. Создание программного интерфейса между приложением и функциями Проводника обычно состоит из 7 типовых этапов, которые описаны ниже.
Этап 1. Сначала нужно создать в меню (например, в главном меню) и в программе возможность выполнения команды пользователя. Например, в меню это будет кнопка Найти файл, а в программе – метка для соответствующей обработки типа
case IDM_FOPEN:
Значение константы IDM_FOPEN может быть любым, а имя ее может быть другим.
Этап 2. В глобальных переменных программы необходимо разместить системную структуру типа OPENFILENAME для работы Проводника. Назовем ее
OPENFILENAME ofn;
Этап 3. С помощью функции GetCurrentDirectory устанавливает программный интерфейс текущего процесса с конкретной папкой: либо это текущая папка, либо конкретное место в файловой системе (например, "C:\\"). Функция определяется как
DWORD GetCurrentDirectory(DWORD nBufferLength,
LPTSTR lpBuffer);
Параметр nBufferLength – это размер буфера для работы с папкой (байт). Указатель содержит адрес буфера для текущей директории.
Этап 4. Целесообразно установить «фильтры» для просмотра содержимого папок в соответствии с суффиксами, например, просматривать только doc-файлы, txt-файлы или какие-то другие. Это делается с помощью функции LoadString(), которая загружает строку ресурсов с фильтрами-суффиксами из исполняемого файла ресурсов, помещает в буфер и оформляет ее нулевыми символами-разделителями. Она определяется как
int LoadString(HINSTANCE hInstance, UINT uID,
LPTSTR lpBuffer, int nBufferMax);
Параметр hInstance – это дескриптор программного модуля, к которому относится строка ресурсов. Идентификатор ресурса указывается параметром uID. Адрес буфера для размещения строки ресурсов указывается параметром lpBuffer, а размер этого буфера задается параметром nBufferMax.
Этап 5. Применив функцию memset(), необходимо предварительно обнулить все поля системной структуры OPENFILENAME. В общем случае эта функция заполняет поля одним символом. Она определяется как
void *memset(void *dest, int c, size_t count);
Параметр dest – это адрес структуры OPENFILENAME. Целочисленный параметр c – это символ (в нашем случае 0). Параметр count определяет суммарную дляну заполняемых полей.
Этап 6. Необходимо заполнить соответствующие поля структуры OPENFILENAME управляющей информацией. Например:
OPENFILENAME ofn; // ofn – имя структуры
ofn.lpstrTitle = "Найти файл";
Этап 7. Только после этого можно выполнить функцию GetOpenFileName() для обращения к Проводнику, а после ее успешного выполнения (когда пользователь выбрал имя файла) – применить функцию fopen(), чтобы физически выполнить открытие файла и начать его обработку. Напоминаем, что функция fopen() определяется как
FILE *fopen(const char *filename, const *mode);
Параметр filename – это имя файла: либо имя в текущей директории, либо полный путь. Параметр mode задает один из режимов работы с файлом, которые показаны в таблице 13.2.
Функция fopen() возвращает заполненный дескриптор файла – структуру, которая должна быть предварительно определена как переменная типа FILE. После работы с файлом его необходимо закрыть с помощью функции
int fclose(FILE *streem);
Единственный параметр функции fclose – это дескриптор открытого файла.
Таблица 13.2
