Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том2)" -> 132

Visual С++ 6. Полное руководство: В 2 т.(том2) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том2) — Бином, 2006. — 530 c.
Скачать (прямая ссылка): vicualcc2006t2.djvu
Предыдущая << 1 .. 126 127 128 129 130 131 < 132 > 133 134 135 136 137 138 .. 173 >> Следующая

7. Вызов функции Win32 API : : SetClipboardData для задания дескриптора выделенного блока памяти буфера.
8. Вызов функции Win32 API : :CloseClipboard для закрытия буфера.
9. Удаление отмеченных данных из документа обработчиком сообщения command команды Cut.
Текст, копируемый в буфер обмена с использованием описанной процедуры, должен соответствовать стандартным текстовым форматам буфера, имеющим следующие характеристики.
• Текст содержит простой поток печатаемых символов ANSI без внедренных форматирующих или управляющих кодов.
• Каждая строка заканчивается символом возврата каретки и перевода строки.
• Весь блок текста заканчивается символом null.
Если текст, сохраненный в программе, не удовлетворяет перечисленным условиям, то перед копированием в буфер обмена его следует преобразовать.
При добавлении текста в буфер, средства Windows не сохраняют эти данные. Вместо этого необходимо явно выделить блок памяти, скопировать в него текст, а затем передать в буфер дескриптор этого блока памяти. В буфере хранится только дескриптор, предоставляющийся любой программе, которая получает доступ к буферу.
Следовательно, первым действием при добавлении текста в буфер является выделение блока из динамически распределяемой (heap) области памяти вызовом функции Win32 API : :GlobalAlloc.
HGLOBAL GlobalAlloc
(UINT uFlags, // атрибуты размещения;
dword dwBytes); // число байтов размещения
Первому параметру uFlags присваивается один или несколько флагов, описывающих блок памяти, при выделении которого для использования буфером необходимо задать флаги gmEM_moveable и gmem_ddeshare. Кроме того, при добавлении флага GMEm_zeroinit блок памяти будет инициализирован нулями. Значения всех задаваемых флагов смотрите в документации на функцию ::GlobalAlloc в разделах справочной, системы: Platform SDK, Windows Base Sen'ices, General Library, Memory Management, Memory Management Reference, Memory Management Functions.
Во втором параметре dwBytes задается желаемый размер блока памяти в байтах. Задавая его, убедитесь в наличии места для символа null, завершающего текст. В случае удачи функция : : GlobalAlloc возвращает дескриптор блока памяти, а при невозможности выделения памяти — возвращается значение null.
Предположим, что текст, копируемый в буфер, содержится внутри символьного массива Buffer, отформатирован и заканчивается символом null. Тогда память выделяется следующим образом.
HGLOBAL НМет;
НМет=: .-GlobalAlloc
(GMEM_MOVEABLE | GMEM_DDESHARE,
Strien (Buffer) + 1); if (НМет == NULL)
{
AfxMessageBox ("Error copying data to the Clipboard."); return;
}
Для получения доступа к блоку выделенной памяти вызовите функцию Win32
API : :GlobalLock,
LPVOID GlobalLock (HGLOBAL hglbMem);
где hglbMem — дескриптор, получаемый из функции GlobalAlloc. В случае удачного завершения функция ::GlobalLock возвращает указатель на начало блока памяти. В случае ошибки — возвращается NULL. Следующий код получает указатель на область памяти, выделенную в предыдущем примере.
char *PMem;
PMem = (char *)::GlobalLock (HMem); if (Pmem == NULL) і
::GlobalFree (HMem);
AfxMessageBox ("Error copying data to the Clipboard."); return;
}
Можно заметить, что если вызов функции : :GlobalLock завершается ошибкой, то перед выходом из функции блок памяти освобождается с помощью передачи дескриптора памяти в функцию Win32 API : :GlobalFree.
Затем в выделенный блок памяти необходимо скопировать текст, добавляемый в буфер обмена. Для этого используется функция Win32 API : : lstrcpy.
::lstrcpy (PMem, Buffer);
Функция : : lstrcpy копирует строку, заканчивающуюся символом null, из области, заданной вторым параметром, в область, заданную первым. Если текст, добавляемый в буфер, не соответствует формату или не содержит завершающий символ — NULL, то для копирования данных можно написать собственную программу с необходимыми преобразованиями.
Подготовим для передачи в буфер дескриптор выделенной памяти, вызвав функцию Win32 API : : GlobalUnlock.
:GlobalUnlock (HMem);
Для получения доступа к буферу откройте его, вызвав функцию OpenClipboard класса CWnd.
BOOL OpenClipboard ();
В случае удачного завершения функция OpenClipboard возвращает значение TRUE. Значение false возвращается, если другая программа открыла буфер и еще не закрыла его. В таком случае операцию с буфером нельзя завершить. Например:
if (!OpenClipboard ()) (
: :GlobalFree (HMem);
AfxMessageBox ("Clipboard not available.");
}
Поскольку функция OpenClipboard принадлежит классу cwnd, то предполагается, что код внутри функции класса, наследуемого от CWnd, такой же, как и у функции класса представления программы.
После открытия буфера необходимо удалить текущее содержимое буфера, вызвав функцию Win32 API : :EmptyClipboard.
BOOL EmptyClipboard (VOID);
Теперь в буфер можно добавить текст, вызывая функцию Win32 API : : SetClipboardData.
HANDLE SetClipboardData (UINT uFormat, HANDLE hData);
Первый параметр — uFormat — задает формат данных, добавляемых в буфер. Для добавления текста передается значение CFTEXT. (Смотрите описание других стандартных форматов в документации на эту функцию.) Второй параметр — hData — является дескриптором выделенной памяти, содержащей данные:
Предыдущая << 1 .. 126 127 128 129 130 131 < 132 > 133 134 135 136 137 138 .. 173 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100