Операционные системы. Учебное пособие. Марапулец Ю.В. - 171 стр.

UptoLike

Составители: 

Но поскольку в этом случае владелец буфера обмена несет непосредственную ответст-
венность за отображение данных, при их запросе Windows не посылает сообщение
WM_RENDERFORMAT. Просто сообщение из программы просмотра должно быть пе-
редано непосредственно программе-владельцу буфера обмена.
Как было сказано ранее, идентифицировать владельца буфера можно с помощью
функции GetClipboardOwner(). И наоборот, программа-владелец может определить про-
грамму просмотра с помощью функции GetClipboardViewer().
При использовании данного формата программа просмотра посылает приложению-
владельцу запрос на формирование реального изображения и предоставляет ему доступ
к своему окну. Программа просмотра может послать пять различных сообщений:
WM_ASKCBFORMATNAME - Это сообщение посылается для запроса копии имени
формата у владельца буфера обмена. При этом не следует забывать о том, что сам
буфер обмена содержит лишь идентификатор CF_OWNERDISPLAY, поэтому про-
грамма просмотра имеет возможность самостоятельно принимать решение о том,
нужно ли ей знать реальный тип данных. Сообщение WM_ASKCBFORMATNAME
сопровождается указанием в аргументе wParam количества копируемых байтов. Ар-
гумент lParam содержит указатель на буфер, в который должен быть отправлен ре-
зультат.
WM_HSCROLLCLIPBOARD / WM_VSCROLLCLIPBOARD - Эти сообщения посылают-
ся в том случае, когда программа просмотра содержит вертикальную или горизон-
тальную полосу прокрутки и связанные с ними события должны передаваться вла-
дельцу буфера обмена. В аргументе wParam хранится дескриптор окна программы
просмотра, а в аргументе lParam - стандартные идентификаторы, которые сопровож-
дают сообщения WM_HSCROLL и WM_VSCROLL.
WM_PAINTCLIPBOARD - Это сообщение посылается в качестве запроса на обновление
окна программы просмотра, возможно, в ответ на сообщение WM_PAINT. Аргумент
wParam содержит дескриптор окна программы просмотра. Аргумент lParam пред-
ставляет собой глобальный дескриптор объекта, содержащего структуру
PAINTSTRUCT, которая задает обновляемую область экрана. Чтобы определить, вся
ли рабочая область окна требует обновления, владелец буфера обмена должен срав-
нить размеры области рисования, которые содержатся в поле repaint структуры
PAINTSTRUCT,
с размерами, указанными в последнем сообщении
WM_SIZECLIPBOARD.
WM_SIZECLIPBOARD - Это сообщение посылается для указания того, что окно про-
граммы просмотра изменило свои размеры. Аргумент wParam содержит дескриптор
окна просмотра. Аргумент lParam представляет собой глобальный дескриптор объек-
та, содержащего структуру RECT, которая задает обновляемую область.
В ответ на любое из этих сообщений владелец буфера обмена должен вызвать
функцию InvalidateRect() или обновить окно просмотра и соответствующим образом ус-
тановить позицию бегунков полос прокрутки.
Приложения могут также объявлять собственные частные форматы буфера об-
мена, зарегистрировав новый формат с помощью функции RegisterClipboardFormat():
wFormat = RegisterClipboardFormat( lpszFormatTitle );
Новый идентификатор wFormat получает значение из диапазона от 0xC000 до
0xFFFF и может использоваться как параметр функций SetClipboardData() и GetClip-
boardData(). Чтобы другие приложение или другой экземпляр того же приложения смог-
ли прочитать данные из буфера обмена в этом формате, им необходимо предоставить
аналогичный идентификатор wFormat. Его значение может передаваться через буфер
обмена в формате CF_TEXT.
173
Но поскольку в этом случае владелец буфера обмена несет непосредственную ответст-
венность за отображение данных, при их запросе Windows не посылает сообщение
WM_RENDERFORMAT. Просто сообщение из программы просмотра должно быть пе-
редано непосредственно программе-владельцу буфера обмена.
      Как было сказано ранее, идентифицировать владельца буфера можно с помощью
функции GetClipboardOwner(). И наоборот, программа-владелец может определить про-
грамму просмотра с помощью функции GetClipboardViewer().
      При использовании данного формата программа просмотра посылает приложению-
владельцу запрос на формирование реального изображения и предоставляет ему доступ
к своему окну. Программа просмотра может послать пять различных сообщений:
WM_ASKCBFORMATNAME - Это сообщение посылается для запроса копии имени
    формата у владельца буфера обмена. При этом не следует забывать о том, что сам
    буфер обмена содержит лишь идентификатор CF_OWNERDISPLAY, поэтому про-
    грамма просмотра имеет возможность самостоятельно принимать решение о том,
    нужно ли ей знать реальный тип данных. Сообщение WM_ASKCBFORMATNAME
    сопровождается указанием в аргументе wParam количества копируемых байтов. Ар-
    гумент lParam содержит указатель на буфер, в который должен быть отправлен ре-
    зультат.
WM_HSCROLLCLIPBOARD / WM_VSCROLLCLIPBOARD - Эти сообщения посылают-
    ся в том случае, когда программа просмотра содержит вертикальную или горизон-
    тальную полосу прокрутки и связанные с ними события должны передаваться вла-
    дельцу буфера обмена. В аргументе wParam хранится дескриптор окна программы
    просмотра, а в аргументе lParam - стандартные идентификаторы, которые сопровож-
    дают сообщения WM_HSCROLL и WM_VSCROLL.
WM_PAINTCLIPBOARD - Это сообщение посылается в качестве запроса на обновление
    окна программы просмотра, возможно, в ответ на сообщение WM_PAINT. Аргумент
    wParam содержит дескриптор окна программы просмотра. Аргумент lParam пред-
    ставляет собой глобальный дескриптор объекта, содержащего структуру
    PAINTSTRUCT, которая задает обновляемую область экрана. Чтобы определить, вся
    ли рабочая область окна требует обновления, владелец буфера обмена должен срав-
    нить размеры области рисования, которые содержатся в поле repaint структуры
    PAINTSTRUCT,       с    размерами,    указанными    в   последнем    сообщении
    WM_SIZECLIPBOARD.
WM_SIZECLIPBOARD - Это сообщение посылается для указания того, что окно про-
    граммы просмотра изменило свои размеры. Аргумент wParam содержит дескриптор
    окна просмотра. Аргумент lParam представляет собой глобальный дескриптор объек-
    та, содержащего структуру RECT, которая задает обновляемую область.
      В ответ на любое из этих сообщений владелец буфера обмена должен вызвать
функцию InvalidateRect() или обновить окно просмотра и соответствующим образом ус-
тановить позицию бегунков полос прокрутки.
      Приложения могут также объявлять собственные частные форматы буфера об-
мена, зарегистрировав новый формат с помощью функции RegisterClipboardFormat():

wFormat = RegisterClipboardFormat( lpszFormatTitle );

     Новый идентификатор wFormat получает значение из диапазона от 0xC000 до
0xFFFF и может использоваться как параметр функций SetClipboardData() и GetClip-
boardData(). Чтобы другие приложение или другой экземпляр того же приложения смог-
ли прочитать данные из буфера обмена в этом формате, им необходимо предоставить
аналогичный идентификатор wFormat. Его значение может передаваться через буфер
обмена в формате CF_TEXT.


                                          173