Операционная система Windows 95 для программиста


Описание функций - часть 9


После того как файл будет открыт, начнется процесс записи. Он несколько необычен, так как использует механизм обратного вызова функции, выполняющей запись данных в файл.

Инициирование процесса записи выполняется посылкой сообщения EM_STREAMOUT , причем в зависимости от нужного формата выходного файла (текстовый формат или формат RTF) для этого сообщения указывается разное значение параметра wParam:

_strupr(&ofn.lpstrFile[ofn.nFileExtension]); if(!strncmp(&ofn.lpstrFile[ofn.nFileExtension], "RTF", 3)) SendMessage(hwndEdit, EM_STREAMOUT, SF_RTF, (LPARAM)&es); else SendMessage(hwndEdit, EM_STREAMOUT, SF_TEXT, (LPARAM)&es);

В любом случае через параметр lParam необходимо передать адрес предварительно подготовленной структуры типа EDITSTREAM , которая определена следующим образом:

typedef struct _editstream { DWORD dwCookie; DWORD dwError; EDITSTREAMCALLBACK pfnCallback; } EDITSTREAM;

Через параметр dwCookie можно передать функции обратного вызова любое 32-разрядное значение. Так как в нашем случае функция обратного вызова будет выполнять запись в файл, через этот параметр мы передаем идентификатор открытого файла:

es.dwCookie = (DWORD)hFile; es.dwError = 0; es.pfnCallback = SaveCallback;

Через поле dwError передается код ошибки, поэтому перед началом процесса записи мы записываем в него нулевое значение.

И, наконец, через поле pfnCallback необходимо передать адрес функции обратного вызова, которая будет выполнять запись данных в файл. Наша функция называется SaveCallback; вы можете выбрать любое другое имя. Функция обратного вызова SaveCallback будет описана ниже.

После того как функция SendMessage возвратит управление, выходной файл следует закрыть.

Дополнительно мы сбрасываем признак модификации редактируемого файла, так как все изменения были только что сохранены. Для этого мы посылаем органу управления Rich Edit сообщение EM_SETMODIFY :

SendMessage(hwndEdit, EM_SETMODIFY, FALSE, 0L);

Если параметр wParam этого сообщения имеет значение FALSE, флаг модификации сбрасывается, если TRUE - устанавливается.




Начало  Назад  Вперед