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

 

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

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

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

3. Используется дескриптор растрового изображения для его копирования или отображения (без изменения содержимого растрового изображения).
4. Вызывается функция : : Cioseciipboard для закрытия буфера.
Например, следующий обработчик сообщений command для команды Paste получает растровое изображение из буфера и отображает его в окне представления (левый верхний угол растрового изображения помещается в левый верхний угол окна).
void CProgView::OnEditPaste() {
// TODO: Здесь добавьте собственный код обработчика
CClientDC ClientDC (this); CBitmap BitmapClip; BITMAP BitmapClipInfo; HANDLE HBitmapClip; CDC MemDC;
// 1. Откройте буфер if (!OpenClipboard ()) return;
// 2. Получите дескриптор растрового изображения из буфера HBitmapClip = ::GetClipboardData (CF_BITMAP); if (HBitmapClip == NULL) {
::Cioseciipboard ();
return;
}
// 3. Используйте дескриптор растрового изображения // для его отображения
// Инициализируйте объект растрового изображения, // используя дескриптор из буфера BitmapClip.Attach (HBitmapClip);
// Получите информацию по растровому изображению BitmapClip.GetObject (sizeof (BITMAP), &BitmapClipInfо);
// Создайте объект контекста устройства и выберите // в нем растровое изображение MemDC. CreateCompatibleDC (SClientDC); MemDC.SelectObject (SBitmapClip) ;
// Скопируйте содержимое растрового изображения б рабочую область ClientDC.BitBlt (О О,
BitmapClipInfo.bmWidth,
BitmapClipInfo.bmHeight,
&MemDC,
0,
0,
3RCCOPY);
// Удалите дескриптор растрового изображения // из объекта растрового изображения BitmapClip.Detach ();
// 4. Закройте буфер ::CloseClipboard ();
(
Функция OnEditPaste объявляет объект класса CBitmap для управления растровым изображением, полученным из буфера. Вызывается функция : : GetclipboardData для получения дескриптора растрового изображения, который передается в функцию Attach класса CGdiObject для инициализации объекта растрового изображения содержимым буфера. Затем вызывается функция Getobject класса CGdiObject для получения информации о растровом изображении и записывается в поле BITMAP структуры BitmapCliplnf о.
Функция OnEditPaste создает контекст устройства памяти, выбирает растровое изображение и вызывает BitBlt, чтобы скопировать изображение в рабочую область окна. При этом значения ширины и высоты данного изображения получают из полей bmWidth и bmHeight структуры BITMAP.
Примечание
Если размеры растрового изображения превышают размеры окна представления, то Windows автоматически отсекает часть, выходящую за пределы окна.
Перед очисткой буфера функция OnPaste вызывает функцию Detach, чтобы удалить дескриптор растрового изображения из объекта BitmapClip. (В этом случае, как и в рассмотренном ранее, деструктор класса CBitmap не может уничтожить растровое изображение, хранящееся в буфере.) После вызова функции CloseClipboard дескриптор растрового изображения не используется.
Примечание
Если программа обеспечивает передачу текста, функция OnEditPaste проверяет оба формата (cf_bitmap и cfjtext) , а затем переходит на соответствующую программу в зависимости от обнаруженного формата данных. (Если данные нужного формата в буфере не обнаружены, то функция ::GetclipboardData возвращает значение null.) Если в буфере содержатся данные обоих форматов, то выбирается один из них.
Использование буфера обмена для
передачи данных зарегистрированных форматов
Стандартные форматы буфера описаны в документации на функцию SetClipboardData. Однако передаваемые данные могут не соответствовать ни одному из них. Например, при написании текстового процессора можно сохранять форматированный текст, используя собственный пользовательский формат. Символы текста могут быть сохранены с внедренными кодами, задающими шрифт и другие свойства текста. Тем не менее, можно использовать буфер для передачи данных с помощью вызова функции Win32 API : :RegisterClipboardFormat, позволяющей зарегистрировать собственный формат данных.
OINT RegisterClipboardFormat (LPCTSTR IpszFormat);
В функцию ::RegisterClipboardFormat можно передать любое нужное имя, и она возвратит идентификатор формата. Можно использовать другие функции буфера для переноса форматированного текста теми способами, которые применялись для передачи простого текста. Однако вместо указания формата cf_text задается его идентификатор, возвращенный функцией : : RegisterClipboardFormat. Например:
UINT TextFormat;
TextFormat = ::RegisterClipboardFormat ("MyAppText") ;
то текст, соответствующий этому формату, добавляется в буфер так:
::SetClipboardData (TextFormat, HMyText);
В этом вызове имя HMyText задает дескриптор блока памяти с форматированным текстом, выделенным функцией ::GlobalAlloc. Аналогично, в функции : : IsClipboardAvailable и :: GetClipboardData необходимо передать не СF_TEXT, a TextFormat.
Примечание
Если специальный формат уже зарегистрирован под указанным именем, то функция : :RegisterClipboardFormat возвращает идентификатор этого же формата и не регистрирует новый. Следовательно, несколько программ могут обмениваться данными с буфером, используя зарегистрированный формат, если каждая из программ знает имя формата и может интерпретировать описанные данные. Учитывая это свойство, необходимо выбирать уникальное имя, чтобы избежать случайного совместного использования формата, зарегистрированного другой программой!
Предыдущая << 1 .. 130 131 132 133 134 135 < 136 > 137 138 139 140 141 142 .. 173 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100