- •Министерство образования и науки Российской Федерации
- •1. Стандартные диалоги
- •1.2. Работа с Common Dialogs
- •1.3. Стандартные диалоги открытия - сохранения файлов
- •1.3.1. Инициализация структуры перед вызовом диалога открытия или сохранения файла
- •1.3.2. Вызов диалога открытия файла
- •1.3.3. Вызов диалога сохранения файла
- •1.4. Стандартный диалог выбора цвета
- •1.4.1. Инициализация структуры перед вызовом диалога выбора цвета
- •2. Операции с файлами. Создание, открытие файлов. Запись - чтение данных из файлов.
- •2.1. Создание - открытие файла
- •2.2. Чтение из файла
- •2.3. Запись в файл
- •2.4. Перемещение указателя файла
- •3. Порядок выполнения работы
- •4. Контрольные вопросы
- •Приложение Файл cmdlg.Cpp
- •Файл cmdlg.Rc
- •Файл resource.H
1.4.1. Инициализация структуры перед вызовом диалога выбора цвета
Минимально необходимая инициализация структуры CHOOSECOLOR заключается в обнулении структуры, установки размера структуры - поле lStructSize, в выборе начального цвета rgbResult и установка указателя lpCustColors на статический массив из шестнадцати цветов.
Пример инициализации структуры CHOOSECOLOR:
// обнуление структуры
memset(&cc, 0, sizeof(cc));
// обнуление массива цветов
memset(crCustColors, 0, sizeof(crCustColors));
// задается размер структуры
cc.lStructSize = sizeof(cc);
// устанавливаем указатель на массив цветов
cc.lpCustColors = crCustColors;
После того, как структура проинициализирована для вызова стандартного диалога выбора цвета необходимо вызвать функцию ChooseColor, куда в качестве параметра передать указатель на инициализированную структуру.
Пример вызова функции ChooseColor:
ChooseColor(&cc);
Функция ChooseColor:
BOOL ChooseColor( LPCHOOSECOLOR lpcc
// указатель на структуру с инициализированными данными
);
lpcc - указатель на структуру с данными для инициализации диалога
Возвращает ненулевой результат в случае успешного завершения, если пользователь нажал ОК, в противном случае возвращает ноль.
После возврата в успешном случае поле rgbResult содержит цвет, выбранный пользователем.
2. Операции с файлами. Создание, открытие файлов. Запись - чтение данных из файлов.
Работа с файлами в Windows похожа на работу с файлами под DOS. В начале необходимо открыть или создать файл, а затем можно осуществлять чтение или запись.
Порядок чтения/записи из файла можно рассматривать в виде следующей последовательности шагов:
Открытие или создание файла с помощью функции CreateFile, которая возвращает дескриптор файла.
Чтение данных из файла с помощью функции ReadFile или запись в файл с помощью функции WriteFile, куда в качестве первого параметра передается дескриптор файла, полученный на предыдущем шаге.
Закрытие файла с помощью функции CloseHandle, в качестве параметра используется дескриптор файла.
Итак, рассмотрим каждый шаг.
2.1. Создание - открытие файла
Для создания или открытия существующего файла используется функция CreateFile.
HANDLE CreateFile(
LPCTSTR lpFileName, // указатель на строку - имя файла
DWORD dwDesiredAccess, // вид доступа (чтение - запись)
DWORD dwShareMode, // режим разделения
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // указатель на атрибуты //безопасности
DWORD dwCreationDistribution, // способ создания
DWORD dwFlagsAndAttributes, // атрибуты файла
HANDLE hTemplateFile // дескриптор файла откуда скопировать атрибуты
);
lpFileName - указатель на строку оканчивающуюся нулевым символом, определяющую имя файла
dwDesiredAccess - определяет тип доступа к файлу, может быть комбинацией следующих значений:
GENERIC_READ - доступ на чтение
GENERIC_WRITE - доступ на запись
dwShareMode - набор битовых флагов, определяющий, как файл разделяется, если равен нулю - файл не разделяется
FILE_SHARE_READ - последующие операции открытия файла будут успешными, если он будет открываться для чтения
FILE_SHARE_WRITE - последующие операции открытия файла будут успешными, если он будет открываться для записи
lpSecurityAttributes - указывает на структуру SECURITY_ATTRIBUTE, которая определяет, может ли возвращаемый дескриптор наследоваться дочерними процессами, если равен NULL, дескриптор не может наследоваться.
dwCreationDistribution - определяет какие действия производить над существующими файлами, и над теми которые не существуют.
CREATE_NEW - функция возвращает отрицательный результат, если файл уже существует
CREATE_ALWAYS - функция всегда создает новый файл, перезаписывает, если такой файл уже существует
OPEN_EXISTING - функция открывает существующий файл, возвращает отрицательный результат, если такого файла нет
OPEN_ALWAYS - функция всегда открывает файл, если файл не существует, то создает его
dwFlagsAndAttributes - определяет атрибуты файла и флаги
Атрибуты
FILE_ATTRIBUTE_ARCHIVE - архивный файл
FILE_ATTRIBUTE_COMPRESSED - сжатый файл
FILE_ATTRIBUTE_HIDDEN - скрытый файл
FILE_ATTRIBUTE_NORMAL - никаких других атрибутов нет
FILE_ATTRIBUTE_READONLY - только для чтения
FILE_ATTRIBUTE_SYSTEM - системный файл, используется операционной системой
FILE_ATTRIBUTE_TEMPORARY - временный файл
Флаги
FILE_FLAG_WRITE_THROUGH - инструктирует систему не хранить промежуточные данные в кэше, а писать сразу на диск
FILE_FLAG_OVERLAPPED - инструктирует систему так инициализировать объект, что операции, которые занимают значительное время возвращали ERROR_IO_PENDING. Когда операция завершена специальное событие устанавливается, сообщая об этом.
FILE_FLAG_NO_BUFFERING - инструктирует систему открывать файл без промежуточного буфера и кэширования
FILE_FLAG_RANDOM_ACCESS - файл открывается с произвольным доступом
FILE_FLAG_SEQUENTIAL_SCAN - файл открывается с последовательным доступом
FILE_FLAG_DELETE_ON_CLOSE - файл стирается операционной системой после закрытия
hTemplateFile - определяет дескриптор файла-шаблона с доступом на чтение GENERIC_READ, с файла - шаблона копируются атрибуты создания
В случае успешного завершения возвращает дескриптор открытого файла, в противном случае возвращает значение INVALID_HANDLE_VALUE.
Пример открытия файла:
hSrc = CreateFile(ofn.lpstrFile, GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
Рассмотрим порядок чтения файлов.
Если файл небольшого размера, то его можно считать целиком, для этого в начале необходимо определить размер файла с помощью функции GetFileSize.
DWORD GetFileSize(
HANDLE hFile, // дескриптор файла
LPDWORD lpFileSizeHigh //указатель на старшее слово для размера файла
);
hFile - дескриптор открытого файла
lpFileSizeHigh - указатель на переменную, в чье старшее слово будет возвращен размер файла, может быть NULL.
Возвращаемое значение - двойное слово, содержащее размер файла, при аварийном завершении возвращает 0xFFFFFFFF.
Пример вызова:
// определяем размер файла
fsize=GetFileSize(hSrc,NULL);