На щастя, API-інтерфейси Win32 надають простий метод затримки приміщення даних в буфер обміну, поки не буде згенерований запит на вилучення даних у певному форматі. Це називається відтворенням за затримкою (delayed rendering). Для його задіяння достатньо передати значення NULL як дескриптора типу HANDLE на дані буфера обміну при установці даних за допомогою функції SetClipboardData (). Якщо програма вимагає відтворення формату, відправляється повідомлення WM_RENDERFORMAT із змінною wParam, щоб вказати запитуваний формат.
Відтворення за затримкою економить час і ресурси. Єдиний недолік подібного підходу полягає в тому, що система може не відповідати негайно після запиту користувача на вставку, оскільки деякий час витрачається на форматування даних. p> Проте, зазвичай відтворення із затримкою вважається найкращим підходом у разі підтримки великої кількості форматів, або та відсутності часу на приміщення даних у буфер обміну. Пам'ятайте, часто буває, що дані вирізаються або копіюються, але Не вставляйте.
Прикладом відтворення із затримкою служать функції ClipboardFormatAvailable () і GetPriorityClipboardFormat ().
Формат CF_OWNERDISPLAY
Унікальний формат буфера обміну CF_OWNERDISPLAY покладає функції відображення даних буфера обміну на його власника. Власник буфера обміні приймає набір повідомлень, що описують зміни клієнтської області у вікні перегляду буфера обміну. Ці повідомлення зведені в табл.2.
Одним з наочних прикладів формату CF_OWNERDISPLAY служить утиліта Clipbook - вікно перегляду буфера обміну Windows, яке розпізнає, здавалося б необмежену кількість форматів. Насправді Clipbook надає свою клієнтську область власнику даних буфера обміну, який, звичайно ж, здатний відображати вміст так само, як і у вихідному документі. Єдина відмінність для власника буфера обміну становить вікно, де повинні виводитися дані. Однак це не вносить змін в логіку програми. <В
Таблиця 2
Повідомлення, що приймаються власником буфера обміну для відображення даних
Повідомлення
Значення
WM_ASKCBFORMATNAME
Відправляється, коли вікно перегляду буфера обміну запитує ім'я формату. Власник буфера обміну повинен скопіювати байти wParam в буфер, на який вказує параметр lPrarm.
WM_PAINTCLIPBOARD
Відправляється, коли клієнтська область вікна буфера обміну вимагає оновлення. Параметр wParam є дескриптором вікна перегляду буфера обміну. Параметр lParam є покажчиком на PAINTSTRUCT. /Td>
WM_SIZECLIPBOARD
Відправляється при зміні розміру клієнтської області вікна перегляду буфера обміну. Параметр wParam є дескриптором вікна перегляду буфера обміну. Параметр lParam - покажчик на структуру RECT. /Td>
WM_HSCROLLCLIPBOARD і WM_VSCROLLCLIPBOARD
Відправляється при прокручуванні клієнтської області вікна перегляду буфера обміну. Параметр wParam є дескриптором вікна перегляду буфера обміну. Молодше слово параметра lParam позначає тип запиту смуги прокрутки (подібно параметру wParam в повідомленні WM_HSCROLL або WM_VSCROLL). Старше слово параметра lParam вказує позицію бігунка тоді і тільки тоді, коли смуга прокрутки запитує SB_THUMBPOSITION.
Формат буфера обміну CF_OWNERDISPLAY забезпечує найвищу ступінь різноманітності всіх форматів оскільки за їх відображення відповідає джерело даних. Якщо додаток підтримує незвичайний формат буфера обміну (наприклад, приватний або зареєстрований), існує тільки дві можливості відображення даних поза програми:
- відображення власником;
- написання вікна перегляду буфера обміну. ​​
4. Вікна перегляду буфера обміну
Вікно перегляду буфера обміну являє собою програму, призначену для перегляду вмісту буфера обміну. Зазвичай вікна перегляду підтримують безліч форматів, але не можуть правильно інтерпретувати приватні зареєстровані формати. У цьому зв'язку може знадобитися створити вікно перегляду буфера обміну самостійно.
Слід враховувати, що вікно перегляду буфера обміну не володіє даними, якими керує. Вимоги до вікна перегляду:
1. Вікно перегляду ні в якому випадку не має виконувати запис у вміст буфера обміну. p> 2. Вікно перегляду ніколи не повинно залишати небудь елемент вмісту буфера обміну заблокованим. p> 3. Оскільки в будь-який момент часу можуть виконуватися кілька вікон перегляду та повідомлення передаються між ними допомогою зв'язаного списку вікон перегляду, створювана програма повинна відповідати наступним угодам:
- Зберігати значення повернення функції SetClipboardViewer (), яке вказує на наступне вікно перегляду б...