Win32 API. Буфер обмена
Страница 20. Создание Окна просмотра в Буфере обмена


Создание Окна просмотра в Буфере обмена

Окно окна просмотра буфера обмена отображает текущее содержание буфера обмена и принимает сообщения, когда буфер обмена изменяет содержимое. Чтобы создать окно просмотра буфера обмена, ваша прикладная программа должна сделать следующее:

Добавить окно к цепочке окон просмотра буфера обмена.

Обработать сообщение WM_CHANGECBCHAIN.

Обработать сообщение WM_DRAWCLIPBOARD.

Удалить окно из цепочки окон просмотра буфера обмена прежде, чем оно будет разрушено.

Добавление окна в цепочку окон просмотра буфера обмена

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

Следующий пример добавляет окно к цепочке окон просмотра буфера обмена в ответ на сообщение WM_CREATE.

case WM_CREATE:
// Добавление окна к цепочке окон просмотра буфера обмена.
hwndNextViewer = SetClipboardViewer(hwnd);
break;

Обработка сообщения WM_CHANGECBCHAIN

Окно окна просмотра буфера обмена принимает сообщение WM_CHANGECBCHAIN, когда другое окно удаляется из цепочки окон просмотра буфера обмена. Если удаляемое окно - следующее окно в цепочке, окно, принимающее сообщение, должно отцепить следующее окно из цепочки. Иначе, это сообщение должно быть передано в следующее окно в цепочке.

Следующий пример показывает обработку сообщения WM_CHANGECBCHAIN.

case WM_CHANGECBCHAIN:
// Если следующее окно закрывается, восстановление цепочки

if ((HWND) wParam == hwndNextViewer)
hwndNextViewer = (HWND) lParam;

// Иначе, передача сообщения следующей связи
else if (hwndNextViewer != NULL)
SendMessage(hwndNextViewer, uMsg, wParam, lParam);
break;

Удаление окна из цепочки окон просмотра буфера обмена

Чтобы удалить окно из цепочки окон просмотра буфера обмена, окно вызывает функцию ChangeClipboardChain. Следующий пример удаляет окно из цепочки окон просмотра буфера обмена в ответ на сообщение WM_DESTROY.

case WM_DESTROY:
ChangeClipboardChain(hwnd, hwndNextViewer);
PostQuitMessage(0);
break;

Обработка сообщения WM_DRAWCLIPBOARD

Сообщение WM_DRAWCLIPBOARD предупреждает окно просмотра буфера обмена, что содержание буфера обмена изменилось. Окно должно сделать следующее при обработке сообщения WM_DRAWCLIPBOARD:

Определить, который из доступных форматов буфера обмена должен появляться.

Извлечь информацию о данных буфера обмена и отобразить это в окне. Или, если формат буфера обмена - CF_OWNERDISPLAY, послать сообщение WM_PAINTCLIPBOARD владельцу буфера обмена.

Послать сообщение следующему окну в цепочке окон просмотра буфера обмена.

Как пример обработки сообщения WM_DRAWCLIPBOARD, см. листинг примера в Примере Окна просмотра буфера обмена.

 
« Предыдущая статья   Следующая статья »