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

 

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

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

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

5. Скопировать текст из буфера во временный буфер.
6. Вызвать функцию : : GlobalUnlock, чтобы разблокировать память буфера.
7. Вызвать функцию .- : Cioseciipboard для закрытия буфера.
8. После окончания обработки программой текста во временном буфере и добавления текста в документ, освободить буфер.
После открытия буфера можно получить дескриптор блока памяти, содержащего текст, вызывая функцию Win32 API : .-GetClipboardData.
HANDLE HClipText;
HClipText = ::GetClipboardData (CF_TEXT); if (HClipText == NULL) {
::Cioseciipboard ();
AfxMessageBox ("Error obtaining text from Clipboard."); return;
}
Параметр, передаваемый в функцию :: GetClipboardData, определяет требуемый формат данных. Если буфер не содержит данных заданного формата, то возвращается значение null. Это может случиться, если другой процесс удалил данные из буфера после того, как программе стала доступна команда Paste, но до открытия буфера. Если требуются данные в формате cf_text, но буфер содержит только данные других текстовых форматов (cf_oemtext или CF_UNIC0DETEXT), то Windows автоматически преобразует их в формат CFTEXT.
Дескриптор, полученный при вызове функции : :GetClipboardData, остается корректным только до вызова функции :: Cioseciipboard. Данные из блока памяти можно читать или копировать, но нельзя изменять или вызывать функцию : :GlobalFree для освобождения блока памяти. Он должен оставаться неизменным, чтобы буфер мог предоставить данные при последующих запросах какой-либо программы.
После успешного получения дескриптора блока памяти, содержащего текст, можно выделить временный буфер для хранения его копии. Вызовите функцию Win32 API : :GlobalSize, чтобы определить размер блока памяти буфера. Например, в следующем фрагменте программы для выделения временного буфера достаточного объема используется оператор new.
char *PTempBuffer = new char [: .- GlobalSize (HClipText)]; if (PTempBuffer == 0)
{
::CloseClipboard (); AfxMessageBox ("Out of memory!"); return; }
В этом примере функция : : GetClipboardData возвращает дескриптор памяти HClipText.
Для получения указателя на блок памяти необходимо вызвать функцию ::GlobalLock.
char *PClipText;
PClipText = (char *)::GlobalLock (HClipText); if (PClipText == NULL) {
::CloseClipboard (); delete [ ] PTempBuffer;
AfxMessageBox ("Error obtaining text from Clipboard") ;
return;
}
Теперь можно прочитать или скопировать данные буфера, но сделать это нужно как можно быстрее. Перед закрытием буфера убедитесь, что для разблокирования памяти буфера была вызвана функция : : GlobalUnlock.
::GlobalUnlock (HClipText); ::CloseClipboard ();
После вызова функции -.-.CloseClipboard нельзя использовать дескриптор памяти, полученный из буфера. Если текст скопирован во временный буфер, то программа в любой момент может обработать текст и очистить буфер.
delete [] PTempBuffer;
Ниже приведен обработчик сообщения command, определенный как функция класса представления и получающий текст из буфера по команде Paste.
void CProgView::OnEditPaste() {
//TODO: Здесь добавьте собственный код обработчика
HANDLE HClipText; char *PClipText; char *PTempBuffer;
// 1. Откройте буфер if (!OpenClipboard ()) {
AfxMessageBox ("Could not open Clipboard.");
return;
}
// 2. Получите дескриптор данных буфера HClipText = ::GetClipboardData (CAF_TEXT); if (HClipText == NULL) {
::Cioseciipboard ();
AfxMessageBox ("Error obtaining text from Clipboard") ; return;
}
// 3. Разместите временный буфер для сохранения текста из буфера PTempBuffer = new char [::GlobalSize (HClipText)]; if (PTempBuffer == 0) {
::Cioseciipboard (); AfxMessageBox ("Out of memory!"); return;
}
// 4. Заблокируйте дескриптор текста в буфере и получите указатель PClipText = (char *)::GlobalLock (HClipText); if (PClipText == Null) {
::Cioseciipboard ()¦; delete [] PTempBuffer;
AfxMessageBox ("Error obtaining text from Clipboard") ; return;
}
// 5. Скопируйте текст из буфера ::lstrcpy (PTempBuffer, PClipText);
// 6. Разблокируйте блок памяти буфера ::GlobalUnlock (HClipText);
// 7. Закройте буфер ::Cioseciipboard ();
// 8. Вставьте текст в документ и очистите временный буфер: InsertText (PTempBuffer); delete [] PTempBuffer;
1
Предполагается, что функция InsertText вставляет из буфера в текущий документ текст, заканчивающийся символом NULL.
Использование буфера
обмена для передачи графических изображений
Графическую информацию можно передать в программу или процесс, используя буфер для обмена растровыми изображениями. В этом разделе вы узнаете, как добавить растровое изображение в буфер и как получить его из буфера. Процедуры, рассмотренные здесь, полезны для разработки программ рисования, текстовых процессоров или других программ, отображающих графику в формате растровых изображений.
Копирование растрового изображения в буфер обмена
Растровое изображение, как и текст, переносится в буфер с помощью команд Cut и Сору. Обработчики сообщения update_command_ui этих команд доступны, если растровое изображение выделено, как в следующем примере:
Предыдущая << 1 .. 128 129 130 131 132 133 < 134 > 135 136 137 138 139 140 .. 173 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100