Win32 API. Буфер обмена

ОГЛАВЛЕНИЕ

Буфер обмена (clipboard)- набор функций и сообщений, который делает возможным передачу данных в прикладные программы, разработанные при помощи Microsoft Win32 прикладного программного интерфейса (API). Поскольку все прикладные программы имеют доступ к буферу обмена, данные могут быть легко перемещаемы между приложениями или внутри прикладной программы.

О буфере обмена

Запоминаемый объект в буфере обмена может быть в любом формате данных, называемом форматом буфера обмена (clipboard format). Каждый формат идентифицирован значением целого числа без знака(unsigned integer). Для стандартных (предопределенных) форматов буфера обмена, это значение - константа, определенная в Win32 API; для зарегистрированных форматов буфера обмена, оно - возвращаемое значение функции RegisterClipboardFormat.

Исключая регистрацию форматов буфера обмена, отдельные окна выполняют большинство действий буфера обмена. Как правило, оконная процедура передает информацию в буфер обмена или из него в ответ на сообщение WM_COMMAND.

Буфер обмена управляется пользователем. Окно должно передавать данные в буфер обмена или из него только в ответ на команду от пользователя. Окно не должно использовать буфер обмена для передачи данных без извещения об этом пользователя. 


 

Форматы буфера обмена

Окно может поместить в буфере обмена больше чем один объект, запись каждого из которых, та же самая информация в другом формате буфера обмена. Пользователям нет необходимости знать форматы буфера обмена, используемые в нем для объекта. 

Зарегистрированные форматы буфера обмена

Многие прикладные программы работают с данными, которые не могут быть переданы в стандартном формате буфера обмена без потери информации. Эти программы могут создавать свои собственные форматы буфера обмена. Формат буфера обмена, который используется прикладной программой, в противоположность стандартному формату, называется зарегистрированным форматом буфера обмена (registered clipboard format). Например, если бы программа обработки текстов скопировала форматированный текст в буфер обмена, который использует стандартный текстовый формат, информация форматирования была бы потеряна. Решение проблемы состоит в том, чтобы зарегистрировать новый формат буфера обмена, такой как расширенный текстовый формат (Rich Text Format - RTF).

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

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

Для ознакомления со списком стандартных форматов буфера обмена, см. функцию SetClipboardData

Собственные форматы буфера обмена

Прикладная программа может идентифицировать собственный формат буфера обмена, определяя значение в диапазоне от CF_PRIVATEFIRST до CF_PRIVATELAST. Прикладная программа может использовать собственный формат буфера обмена для определяемого программой формата данных, который не должен быть зарегистрирован системой.

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

Для получения дополнительной информации о сообщении WM_DESTROYCLIPBOARD, см. Монопольное использование буфера обмена (Clipboard Ownership).

Прикладная программа может помещать дескрипторы данных в буфер обмена, определяя собственный формат в диапазоне с CF_GDIOBJFIRST по CF_GDIOBJLAST. При использовании значений в этом диапазоне, дескриптор данных является не дескриптором объекта GDI, а дескриптором, назначенным функцией GlobalAlloc с флажками GMEM_MOVEABLE и GMEM_DDESHARE. Когда буфер обмена освобождается, система автоматически удаляет объект, использующий функцию GlobalFree

Параллельные форматы буфера обмена

Окно может поместить больше чем один объект в буфере обмена, каждая запись которого, та же самая информация в другом формате буфера обмена. При размещении информации в буфере обмена, окно должно обеспечить данные в стольких форматах, сколько это возможно. Чтобы выяснить, сколько форматов в настоящее время используется на буфере обмена, вызовите функцию CountClipboardFormats.

Форматы буфера обмена, которые содержат самую большую информацию, должны быть помещены в начале буфера обмена, следуя за менее важными квалифицирующими форматами. Окно, вставляющее информацию из буфера обмена, обычно возвращает обратно объект буфера обмена в первом формате, который оно распознает. Поскольку форматы буфера обмена перечислены по порядку, оно помещает в буфер обмена первый распознанный формат, как наиболее квалифицирующий.

Например, предположим, что пользователь копирует стилизованный текст из документа текстового процессора. Окно, содержащее документ, может сначала поместить данные в буфер обмена в зарегистрированном формате, типа RTF. Впоследствии, окно поместит данные в буфер обмена в менее квалифицирующем формате, типа текстового (CF_TEXT).

Когда содержание буфера обмена вставляется в другое окно, окно возвращает обратно данные в наиболее квалифицирующем формате, который оно распознает. Если окно распознает RTF, соответствующие данные вставляются в документ. Иначе, текстовые данные вставляются в документ, а информация о форматировании текста теряется. 

Синтезируемые форматы буфера обмена

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

Формат Буфера обмена	Формат преобразования	Платформа поддержки
CF_BITMAP CF_DIB Windows NT, Windows 95
CF_DIB CF_BITMAP Windows NT, Windows 95
CF_DIB CF_PALETTE Windows NT, Windows 95
CF_ENHMETAFILE CF_METAFILEPICT Windows NT, Windows 95
CF_METAFILEPICT CF_ENHMETAFILE Windows NT, Windows 95
CF_OEMTEXT CF_TEXT Windows NT, Windows 95
CF_OEMTEXT CF_UNICODETEXT Windows NT
CF_TEXT CF_OEMTEXT Windows NT, Windows 95
CF_TEXT CF_UNICODETEXT Windows NT
CF_UNICODETEXT CF_OEMTEXT Windows NT
CF_UNICODETEXT CF_TEXT Windows NT

Если система обеспечивает преобразование между параллельными форматами, нет никакой выгоды от размещения параллельных форматов в буфере обмена. При копировании точечных рисунков, самое лучшее, в буфер обмена поместить только формат CF_DIB. Это потому, что цвета в аппаратно-зависимом точечном рисунке (CF_BITMAP) взаимосвязаны с палитрой системы, которая может измениться до того, как точечный рисунок будет вставлен. Если только формат CF_DIB находится в буфере обмена, а окно запрашивает формат CF_BITMAP, система представляет аппаратно-зависимый точечный рисунок (DIB), используя текущую палитру этого момента.

Если Вы помещаете формат CF_BITMAP в буфер обмена (а не CF_DIB), система выполняет формат буфера обмена CF_DIB, как только буфер обмена будет закрыт. Это гарантирует то, что используется правильная палитра для создания DIB. Преобразования между другими форматами буфера обмена происходят после запроса.


Действия Буфера обмена

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

Чтобы поместить данные в буфер обмена или извлечь данные из него, окно должно сначала открыть буфер обмена, используя функцию OpenClipboard. Одновременно только одно окно может иметь открытым буфер обмена. Чтобы выяснить, какое окно имеет открытый буфер обмена, вызовите функцию GetOpenClipboardWindow. Когда окно закончит работу, оно должно закрыть буфер обмена, вызвав функцию CloseClipboard

Операции Вырезать (Cut) и Копировать (Copy)

Чтобы поместить информацию в буфер обмена, окно сначала очищает его от любого предыдущего содержания, используя функцию EmptyClipboard. Эта функция посылает сообщение WM_DESTROYCLIPBOARD предыдущему владельцу буфера обмена, освобождает ресурсы, связанные с данными в буфере обмена и передает в монопольное использование буфер обмена окну, которое имеет открытый буфер обмена. Чтобы выяснить, какое окно владеет буфером обмена, вызовите функцию GetClipboardOwner.

После очистки буфера обмена, окно помещает данные в него в стольких форматах, сколько это возможно, упорядоченных от наиболее квалифицирующего формата буфера обмена до наименее квалифицирующего. Для каждого формата, окно вызывает функцию SetClipboardData, устанавливая идентификатор формата и глобальный дескриптор памяти. Дескриптор памяти может быть НОЛЬ (NULL), указывая, что окно показывает данные по запросу. Для получения дополнительной информации, см. Отсроченная запись. 

Операция Вставить (Paste)

Чтобы извлечь вставляемую информацию из буфера обмена, окно сначала определяет формат буфера обмена, который извлекает информацию. Как правило, окно перечисляет доступные форматы буфера обмена, используя функцию EnumClipboardFormats, и применяет первый формат, который он распознает. Этим способом выбирается самый лучший доступный формат в соответствии с набором приоритетов, когда данные были помещены в буфер обмена.

Альтернативно, окно может использовать функцию GetPriorityClipboardFormat. Эта функция идентифицирует самый лучший доступный формат буфера обмена согласно заданному приоритету. Окно, которое распознает только один формат буфера обмена, может просто определить, является ли этот формат доступным, используя функцию IsClipboardFormatAvailable.

После определения формата буфера обмена, чтобы использовать его, окно вызывает функцию GetClipboardData. Эта функция возвращает значение дескриптора глобального объекта памяти, содержащего данные в заданном формате. Окно может на короткое время блокировать объект памяти с целью проверки или копирования данных. Однако окно не должно освобождать объект или оставаться блокированным в течение длительного периода времени.

 

Монопольное использование буфера обмена

Владелец буфера обмена (clipboard owner) - окно, связанное информацией с буфером обмена. Окно становится владельцем буфера обмена, когда оно помещает данные в буфер обмена - в особенности, когда оно вызывает функцию EmptyClipboard. Окно остается владельцем буфера обмена до тех пор, пока оно не закрыто, или пока другое окно не освободит буфер обмена.

Когда буфер обмена очищается, владелец буфера обмена получает сообщение WM_DESTROYCLIPBOARD. Перечисление ниже - некоторые причины, почему окно должно обрабатывать это сообщение:

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

Окно поместило данные в буфер обмена в собственном формате. Данные для собственных форматов буфера обмена не освобождаются системой, когда буфер обмена очищается. Следовательно, владелец буфера обмена должен освободить эти данные при получении сообщения WM_DESTROYCLIPBOARD. Для получения дополнительной информации о собственных форматах буфера обмена, см. Форматы буфера обмена.

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

 

Отсроченная запись

При размещении формата в буфере обмена, окно может задержать запись данных в этом формате, пока данные не нужны. Чтобы сделать это, прикладная программа может для параметра hData функции SetClipboardData установить НОЛЬ (NULL). Это полезно, если прикладная программа поддерживает несколько форматов буфера обмена, некоторые или все из которых занимают много времени для записи. Передавая дескриптор НОЛЬ (NULL), окно предоставляет сложные форматы буфера обмена только тогда, если и когда они необходимы.

Если окно задерживает запись формата буфера обмена, оно должно быть подготовлено предоставлять формат после запроса до тех пор, пока оно - владелец буфера обмена. Система посылает владельцу буфера обмена сообщение WM_RENDERFORMAT, когда запрос получен для специфического формата, который не был представлен. После приема этого сообщения, окно должно вызвать функцию SetClipboardData, чтобы поместить глобальный дескриптор памяти буфера обмена в запрошенный формат.

Если владелец буфера обмена разрушен и задержал запись некоторых или всех форматов буфера обмена, он принимает сообщение WM_RENDERALLFORMATS. После приема этого сообщения, окно должно поместить правильные дескрипторы памяти в буфер обмена, для всех форматов буфера обмена, которые он обеспечивает. Это гарантирует, что эти оставшиеся форматы будут доступны, после того как владелец буфера обмена будет разрушен.

Прикладная программа не должна открывать буфер обмена перед вызовом SetClipboardData в ответ на сообщение WM_RENDERFORMAT или WM_RENDERALLFORMATS.

Любые форматы буфера обмена, которые не записаны в ответ на сообщение WM_RENDERALLFORMATS, перестают быть доступными для других прикладных программ и больше не перечисляются функциями буфера обмена.


Память и буфер обмена

Объект памяти, который должен быть помещен в буфер обмена, должен быть размещен, при помощи использования функции GlobalAlloc с флажками GMEM_DDESHARE и GMEM_MOVEABLE.

Как только объект памяти помещен в буфер обмена, монопольное использование этого дескриптора памяти переходит к системе. Когда буфер обмена очищается, а объект памяти имеет один из следующих форматов буфера обмена, система освобождает объект памяти, обращаясь к обозначенной функции Win32:

Наименование функции, которая освобождает объект 	Формат буфера обмена
DeleteMetaFile CF_DSPENHMETAFILE
CF_DSPMETAFILEPICT
CF_ENHMETAFILE
CF_METAFILEPICT
DeleteObject CF_BITMAP
CF_DSPBITMAP
CF_PALETTE
GlobalFree CF_DIB
CF_DSPTEXT
CF_OEMTEXT
CF_TEXT
CF_UNICODETEXT

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

 

Окно просмотра буфера обмена

Окно просмотра буфера обмена (clipboard viewer) - окно, которое отображает текущее содержание буфера обмена. Окно окна просмотра буфера обмена - удобство для пользователя и не воздействует на функции сообщаемых данных буфера обмена.

Как правило, окно окна просмотра буфера обмена может отображать, по крайней мере, три наиболее общих формата: CF_TEXT, CF_BITMAP и CF_METAFILEPICT. Если окно не делает данные доступными в каком-либо из этих трех форматов, оно должно обеспечить данные в форме отображения данных на дисплее или использовать формат владельца - отображающего данные на дисплее.

Цепочка окон просмотра буфера обмена (clipboard viewer chain) - соединение двух или больше объектов так, чтобы они были зависимы работе друг от друга. Эта взаимозависимость (цепочка) позволяет всем запущенным окнам просмотра буфера обмена прикладных программ принимать сообщения, посланные текущему буферу обмена. 

Окна просмотра буфера обмена

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

Каждое окно просмотра буфера обмена должно следить за следующим окном в цепочке окон просмотра. Когда содержание буфера обмена изменится, система посылает сообщение WM_DRAWCLIPBOARD первому окну в цепочке. После модифицирования его изображения, каждое окно просмотра буфера обмена должно передать это сообщение следующему окну в цепочке.

Перед закрытием, окно просмотра буфера обмена должно удаляться из цепочки окон просмотра буфера обмена, путем вызова функции ChangeClipboardChain. Затем система посылает сообщение WM_CHANGECBCHAIN первому окну в цепочке.

Для получения дополнительной информации об обработке сообщений WM_DRAWCLIPBOARD и WM_CHANGECBCHAIN, см. Создание окна просмотра буфера обмена.

 

Форматы отображения данных на дисплее

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

Имеется четыре формата отображения данных на дисплее: CF_DSPBITMAP, CF_DSPMETAFILEPICT, CF_DSPTEXT и CF_DSPENHMETAFILE. Эти форматы отображения записываются таким же образом, как и стандартные форматы, которыми являются CF_BITMAP, CF_TEXT, CF_METAFILEPICT и CF_ENHMETAFILE.

 

Запись данных приложением в собственно формате

Для владельца буфера обмена, который не использует, какой-либо из стандартных общеупотребительных форматов буфера обмена, как вариант для обеспечения формата записи данных должен использоваться формат записи данных приложения - владельца (CF_OWNERDISPLAY) буфера обмена.

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

 

Команды буфера обмена

Пользователь обычно выполняет операции буфера обмена, выбирая команды из меню Редактирование (Edit) прикладной программы. Ниже следует - краткое описание стандартных команд буфера обмена.

  • Вырезать (Cut) - Помещает копию текущего выбора в буфер обмена и удаляет выбранное из документа. Предыдущее содержание буфера обмена разрушается.
  • Копировать (Copy) - Помещает копию текущего выбора в буфер обмена. Документ остается неизменным. Предыдущее содержание буфера обмена разрушается.
  • Вставить (Paste) - Заменяет текущий выбор на содержание буфера обмена. Содержание буфера обмена не изменяется.
  • Удалить (Delete) - Удаляет текущий выбор из документа. Содержание буфера обмена не изменяется. Эта команда не включается в буфер обмена, но она должна быть представлена вместе с командами буфера обмена в меню Редактирования (Edit).



Использование буфера обмена

Выполнение команд Вырезать (Cut), Копировать (Copy) и Вставить (Paste)

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

Выполнение команд Вырезать (Cut), Копировать (Copy) и Вставить (Paste)

Этот раздел описывает, как стандартные команды Вырезать (Cut), Копировать (Copy) и Вставить (Paste) выполняются в прикладной программе. Пример в этом разделе использует эти методы для помещения данных в буфер обмена, используя зарегистрированный формат буфера обмена, формат CF_OWNERDISPLAY и формат CF_TEXT. Зарегистрированный формат используется, чтобы представить прямоугольные или эллиптические текстовые окна, называемые ярлыками (labels). 

Выбор Данных

Прежде, чем информация может быть скопирована в буфер обмена, пользователь должен выбрать конкретную информацию, которая будет скопирована или вырезана. Прикладная программа должна обеспечить средствами пользователя, чтобы выбрать информацию внутри документа и каким-либо видом зрительной обратной связи, чтобы обозначить выбранные данные. 

Создание Меню Редактирования

Прикладная программа должна загрузить таблицу клавиш-ускорителей, содержащую стандартные ускорители клавиатуры для команд меню Редактирование (Edit). Функция TranslateAccelerator должна быть добавлена к циклу сообщений прикладной программы, чтобы клавиши - ускорители дали желаемый результат. Для получения дополнительной информации о ускорителях клавиатуры, см. Ускорители клавиатуры. 


 

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

Не все команды буфера обмена доступны пользователю в любое данное время. Прикладная программа должна обработать сообщение WM_INITMENUPOPUP, чтобы включить пункты меню доступных команд и отключить недоступные команды.

Ниже следует выбирающая (case) структура WM_INITMENUPOPUP для прикладной программы, которая называется Меткой (Label).

case WM_INITMENUPOPUP:
InitMenu((HMENU) wParam);
break;

Функция InitMenu определяется, как указано ниже.

void WINAPI InitMenu(HMENU hmenu)
{
int cMenuItems = GetMenuItemCount(hmenu);
int nPos;
UINT id;
UINT fuFlags;
PLABELBOX pbox = (hwndSelected == NULL) ? NULL :
(PLABELBOX) GetWindowLong(hwndSelected, 0);

for (nPos = 0; nPos < cMenuItems; nPos++)
{
id = GetMenuItemID(hmenu, nPos);
switch (id)
{
case IDM_CUT:
case IDM_COPY:
case IDM_DELETE:
if (pbox == NULL || !pbox->fSelected)
fuFlags = MF_BYCOMMAND | MF_GRAYED;
else if (pbox->fEdit)
fuFlags = (id != IDM_DELETE && pbox->ichSel
== pbox->ichCaret) ?
MF_BYCOMMAND | MF_GRAYED :
MF_BYCOMMAND | MF_ENABLED;
else
fuFlags = MF_BYCOMMAND | MF_ENABLED;

EnableMenuItem(hmenu, id, fuFlags);
break;

case IDM_PASTE:
if (pbox != NULL && pbox->fEdit)
EnableMenuItem(hmenu, id,
IsClipboardFormatAvailable(CF_TEXT) ?
MF_BYCOMMAND | MF_ENABLED :
MF_BYCOMMAND | MF_GRAYED);
else
EnableMenuItem(hmenu, id,
IsClipboardFormatAvailable(
uLabelFormat) ?
MF_BYCOMMAND | MF_ENABLED :
MF_BYCOMMAND | MF_GRAYED);
}
}
}

 

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

Чтобы обрабатывать команды меню, добавьте выбирающую структуру WM_COMMAND к основной оконной процедуре вашей прикладной программы. Ниже следует выбирающая структура WM_COMMAND для оконной процедуры прикладной программы Метка (Lebel).

case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDM_CUT:
if (EditCopy())
EditDelete();
break;
case IDM_COPY:
EditCopy();
break;
case IDM_PASTE:
EditPaste();
break;
case IDM_DELETE:
EditDelete();
break;
case IDM_EXIT:
DestroyWindow(hwnd);
}
break;

Чтобы выполнить команды Копировать (Copy) и Вырезать(Cut), оконная процедура вызывает определяемую программой функцию EditCopy. Для получения дополнительной информации, см. Копирование информации в буфер обмена. Чтобы выполнить команду Вставить (Paste), оконная процедура вызывает определяемую программой функцию EditPaste. Для получения дополнительной информации о функции EditPaste, см. Вставка информации из буфера обмена.


Копирование информации в Буфер обмена

В прикладной программе Метка, функция EditCopy, определяемая программой, копирует текущий выбор в буфер обмена. Эта функция делает следующее:

  1. Открывает буфер обмена путем вызова функции OpenClipboard.
  2. Очищает буфер обмена путем вызова функции EmptyClipboard.
  3. Вызывает функцию SetClipboardData для каждого формата буфера обмена, которыми обеспечена прикладная программа.
  4. Закрывает буфер обмена путем вызова функции CloseClipboard.

В зависимости от текущего выбора, функция EditCopy или копирует область текста, или копирует определяемую программой структуру, представляющую всю пометку. Структура, названная LABELBOX, определяется следующим образом.

#define BOX_ELLIPSE 0
#define BOX_RECT 1
#define CCH_MAXLABEL 80
#define CX_MARGIN 12

typedef struct tagLABELBOX { // box (окно)
RECT rcText; // координаты прямоугольника, содержащего текст
BOOL fSelected; // ИСТИНА (TRUE), если выбрана пометка
BOOL fEdit; // ИСТИНА (TRUE), если выбран текст
int nType; // прямоугольный или эллиптический
int ichCaret; // позиция каретки
int ichSel; // с ichCaret, разграничивает выбор
int nXCaret; // позиция окна в соответствии с ichCaret
int nXSel; // позиция окна в соответствии с ichSel
int cchLabel; // длина текста в atchLabel
TCHAR atchLabel[CCH_MAXLABEL];
} LABELBOX, *PLABELBOX;

Ниже следует функция EditCopy.

BOOL WINAPI EditCopy(VOID)
{
PLABELBOX pbox;
LPTSTR lptstrCopy;
HGLOBAL hglbCopy;
int ich1, ich2, cch;

if (hwndSelected == NULL) return FALSE;

// Открываем буфер обмена и очищаем его.

if (!OpenClipboard(hwndMain))
return FALSE;
EmptyClipboard();

// Получаем указатель на структуру для выбора пометки.

pbox = (PLABELBOX) GetWindowLong(hwndSelected, 0);

// Если текст выбран, он копируется с использованием формата CF_TEXT.
if (pbox->fEdit)
{
if (pbox->ichSel == pbox->ichCaret) // нулевая длина
{
CloseClipboard(); // выбор
return FALSE;
}
if (pbox->ichSel < pbox->ichCaret)
{
ich1 = pbox->ichSel;
ich2 = pbox->ichCaret;
}
else
{
ich1 = pbox->ichCaret;
ich2 = pbox->ichSel;
}
cch = ich2 - ich1;

// Распределяем глобальный объект памяти для текста.
hglbCopy = GlobalAlloc(GMEM_DDESHARE,
(cch + 1) * sizeof(TCHAR));
if (hglbCopy == NULL)
{
CloseClipboard();
return FALSE;
}

// Блокируем дескриптор и копируем текст в буфер.
lptstrCopy = GlobalLock(hglbCopy);
memcpy(lptstrCopy, &pbox->atchLabel[ich1],
cch * sizeof(TCHAR));
lptstrCopy[cch] = (TCHAR) 0; // Символ пробела

GlobalUnlock(hglbCopy);

// Помещаем дескриптор в буфер обмена.
SetClipboardData(CF_TEXT, hglbCopy);
}
// Если никакой текст не выбран, пометка скопирована как единое целое.
else
{
// Сохраним скопированную пометку как локальный объект памяти.
// Эта копирование используется для представления данных по запросу.
// Оно освобождается в ответ на сообщение WM_DESTROYCLIPBOARD.


pboxLocalClip = (PLABELBOX) LocalAlloc(
LMEM_FIXED,
sizeof(LABELBOX));

if (pboxLocalClip == NULL)
{
CloseClipboard();
return FALSE;
}
memcpy(pboxLocalClip, pbox, sizeof(LABELBOX));
pboxLocalClip->fSelected = FALSE;
pboxLocalClip->fEdit = FALSE;

// Помещаем зарегистрированный формат, собственный формат
// и формат CF_TEXT записи данных
// в буфере обмена, используя отсроченную запись.

SetClipboardData(uLabelFormat, NULL);
SetClipboardData(CF_OWNERDISPLAY, NULL);
SetClipboardData(CF_TEXT, NULL);
}
// Закроем буфер обмена.
CloseClipboard();
return TRUE;
}


Вставка информации из буфера обмена

В прикладной программе Метка, определяемая программой, функция EditPaste вставляет содержимое буфера обмена. Эта функция делает следующее:

  1. Открывает буфер обмена путем вызова функции OpenClipboard.
  2. Устанавливает, какой доступен формат буфера обмена для возврата информации.
  3. Извлекает дескриптор данных в избранном формате при помощи вызова функции GetClipboardData.
  4. Вставляет скопированные данные в документ. Дескриптор, возвращенный GetClipboardData, все еще принадлежит буферу обмена, так что прикладная программа не должна освобождать его или оставлять заблокированным.
  5. Закрывает буфер обмена при помощи вызова функции CloseClipboard.

Если пометка выбрана и содержит курсор, функция EditPaste вставляет текст из буфера обмена в месте расположения курсора. Если ничего не выбрано, или если пометка выбрана, функция создает новую пометку в буфере обмена, используя определяемую программой структуру LABELBOX. Структура LABELBOX помещает в буфер обмена, используя зарегистрированный формат буфера обмена.

Ниже показана функция EditPaste.

VOID WINAPI EditPaste(VOID)
{
PLABELBOX pbox;
HGLOBAL hglb;
LPTSTR lptstr;
PLABELBOX pboxCopy;
int cx, cy;
HWND hwnd;

pbox = hwndSelected == NULL ? NULL :
(PLABELBOX) GetWindowLong(hwndSelected, 0);

// Если приложение в режиме редактирования,
// получите текст буфера обмена


if (pbox != NULL && pbox->fEdit)
{
if (!IsClipboardFormatAvailable(CF_TEXT))
return;
if (!OpenClipboard(hwndMain))
return;

hglb = GetClipboardData(CF_TEXT);
if (hglb != NULL)
{
lptstr = GlobalLock(hglb);
if (lptstr != NULL)
{
// Обращаемся к определяемой прикладной программой функции
// ReplaceSelection, чтобы вставить текст и перерисовать окно.


ReplaceSelection(hwndSelected, pbox, lptstr);
GlobalUnlock(hglb);
}
}
CloseClipboard();
return;
}

// Если приложение не в режиме редактирования,
// создаем метку окна.


if (!IsClipboardFormatAvailable(uLabelFormat))
return;
if (!OpenClipboard(hwndMain))
return;

hglb = GetClipboardData(uLabelFormat);
if (hglb != NULL)
{
pboxCopy = GlobalLock(hglb);
if (pboxCopy != NULL)
{
cx = pboxCopy->rcText.right + CX_MARGIN;
cy = pboxCopy->rcText.top * 2 + cyText;
hwnd = CreateWindowEx(
WS_EX_NOPARENTNOTIFY | WS_EX_TRANSPARENT,
atchClassChild, NULL, WS_CHILD, 0, 0, cx, cy,
hwndMain, NULL, hinst, NULL);

if (hwnd != NULL)
{
pbox = (PLABELBOX) GetWindowLong(hwnd, 0);
memcpy(pbox, pboxCopy, sizeof(LABELBOX));
ShowWindow(hwnd, SW_SHOWNORMAL);
SetFocus(hwnd);
}
GlobalUnlock(hglb);
}
}
CloseClipboard();
}


Регистрация формата буфера обмена

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

// Регистрация формата буфера обмена.
LoadString(hinstCurrent, IDS_FORMATNAME, atchTemp,
sizeof(atchTemp));
uLabelFormat = RegisterClipboardFormat(atchTemp);
if (uLabelFormat == 0)
return FALSE;


Обработка сообщений WM_RENDERFORMAT и WM_RENDERALLFORMATS

Если окно передает в функцию SetClipboardData значение дескриптора НОЛЬ (NULL), оно должно обработать сообщения WM_RENDERFORMAT и WM_RENDERALLFORMATS, чтобы предоставить данные по запросу.

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

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

Приложение Метка обрабатывает сообщения WM_RENDERFORMAT и WM_RENDERALLFORMATS следующим образом.

case WM_RENDERFORMAT:
RenderFormat((UINT) wParam);
break;

case WM_RENDERALLFORMATS:
RenderFormat(uLabelFormat);
RenderFormat(CF_TEXT);
break;

В обоих случаях, оконная процедура вызывает определяемую программой функцию RenderFormat, определенную следующим образом

void WINAPI RenderFormat(UINT uFormat)
{
HGLOBAL hglb;
PLABELBOX pbox;
LPTSTR lptstr;
int cch;

if (pboxLocalClip == NULL)
return;

if (uFormat == CF_TEXT)
{
// Размещение буфера для текста.
cch = pboxLocalClip->cchLabel;
hglb = GlobalAlloc(GMEM_DDESHARE,
(cch + 1) * sizeof(TCHAR));
if (hglb == NULL)
return;

// Копирование текста из pboxLocalClip.
lptstr = GlobalLock(hglb);
memcpy(lptstr, pboxLocalClip->atchLabel,
cch * sizeof(TCHAR));
lptstr[cch] = (TCHAR) 0;
GlobalUnlock(hglb);

// Поместим дескриптор в буфер обмена
SetClipboardData(CF_TEXT, hglb);
}
else if (uFormat == uLabelFormat)
{
hglb = GlobalAlloc(GMEM_DDESHARE, sizeof(LABELBOX));
if (hglb == NULL)
return;
pbox = GlobalLock(hglb);

memcpy(pbox, pboxLocalClip, sizeof(LABELBOX));
GlobalUnlock(hglb);

SetClipboardData(uLabelFormat, hglb);
}
}


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

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

case WM_DESTROYCLIPBOARD:
if (pboxLocalClip != NULL)
{
LocalFree(pboxLocalClip);
pboxLocalClip = NULL;
}
break;

 

Использование собственного формата записи данных в буфере обмена

Если окно помещает информацию в буфер обмена, используя формат буфера обмена CF_OWNERDISPLAY, оно должно делать следующее:

Обработать сообщение WM_PAINTCLIPBOARD. Это сообщение посылается владельцу буфера обмена, когда часть окна просмотра буфера обмена должна быть перерисована.

Обработать сообщение WM_SIZECLIPBOARD Это сообщение посылается владельцу буфера обмена, когда было изменено окно просмотра буфера обмена или изменилось его содержание. Как правило, окно отвечает на это сообщение, устанавливая позиции прокрутки и область окна просмотра буфера обмена. В ответ на это сообщение, прикладная программа Метки также модифицирует структуру SIZE для окна просмотра буфера обмена.

Обработать сообщения WM_HSCROLLCLIPBOARD и WM_VSCROLLCLIPBOARD. Эти сообщения посылаются владельцу буфера обмена, когда в окне просмотра буфера обмена происходит событие с полосой прокрутки окна.

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

Оконная процедура приложения Метки (Label) обрабатывает эти сообщения, следующим образом.

LRESULT CALLBACK MainWindowProc(hwnd, msg, wParam, lParam)
HWND hwnd;
UINT msg;
WPARAM wParam;
LPARAM lParam;
{
static RECT rcViewer;

RECT rc;
LPRECT lprc;
LPPAINTSTRUCT lpps;

switch (msg)
{
//
// Дескриптор другого сообщения.
//


case WM_PAINTCLIPBOARD:
// Определение габаритов метки
SetRect(&rc, 0, 0,
pboxLocalClip->rcText.right + CX_MARGIN,
pboxLocalClip->rcText.top * 2 + cyText
);

// Центровка изображения в окне просмотра буфера обмена.
if (rc.right < rcViewer.right)
{
rc.left = (rcViewer.right - rc.right) / 2;
rc.right += rc.left;
}
if (rc.bottom < rcViewer.bottom)
{
rc.top = (rcViewer.bottom - rc.bottom) / 2;
rc.bottom += rc.top;
}

// Прорисовка изображения с использованием установок структуры PAINTSTRUCT,
// путем вызова определяемой приложением функции PaintLabel.


lpps = (LPPAINTSTRUCT) GlobalLock((HGLOBAL) lParam);
PaintLabel(lpps, pboxLocalClip, &rc);
GlobalUnlock((HGLOBAL) lParam);
break;

case WM_SIZECLIPBOARD:
// Сохранение размера окна в статической
// структуре RECT.

lprc = (LPRECT) GlobalLock((HGLOBAL) lParam);
memcpy(&rcViewer, lprc, sizeof(RECT));
GlobalUnlock((HGLOBAL) lParam);

// Установка значения прокрутки в ноль (это разрушение
// необходимо для обработки сообщений WM_HSCROLLCLIPBOARD и
// WM_VSCROLLCLIPBOARD).


SetScrollRange((HWND) wParam, SB_HORZ, 0, 0, TRUE);
SetScrollRange((HWND) wParam, SB_VERT, 0, 0, TRUE);
break;

case WM_ASKCBFORMATNAME:
LoadString(hinst, IDS_OWNERDISPLAY,
(LPSTR) lParam, wParam);
break;

default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}


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

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

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

Обработать сообщение 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, см. листинг примера в Примере Окна просмотра буфера обмена.


Пример листинга Окна Просмотра буфера обмена

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

HINSTANCE hinst;
UINT uFormat = (UINT)(-1);
BOOL fAuto = TRUE;

LRESULT APIENTRY MainWndProc(hwnd, uMsg, wParam, lParam)
HWND hwnd;
UINT uMsg;
WPARAM wParam;
LPARAM lParam;
{
static HWND hwndNextViewer;

HDC hdc;
HDC hdcMem;
PAINTSTRUCT ps;
LPPAINTSTRUCT lpps;
RECT rc;
LPRECT lprc;
HGLOBAL hglb;
LPSTR lpstr;
HBITMAP hbm;
HENHMETAFILE hemf;
HWND hwndOwner;

switch (uMsg)
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);

// Переход в зависимости от формата буфера обмена
switch (uFormat)
{
case CF_OWNERDISPLAY:
hwndOwner = GetClipboardOwner();
hglb = GlobalAlloc(GMEM_DDESHARE,
sizeof(PAINTSTRUCT));
lpps = GlobalLock(hglb);
memcpy(lpps, &ps, sizeof(PAINTSTRUCT));

GlobalUnlock(hglb);

SendMessage(hwndOwner, WM_PAINTCLIPBOARD,
(WPARAM) hwnd, (LPARAM) hglb);

GlobalFree(hglb);
break;

case CF_BITMAP:
hdcMem = CreateCompatibleDC(hdc);
if (hdcMem != NULL)
{
if (OpenClipboard(hwnd))
{
hbm = (HBITMAP)GetClipboardData(uFormat);
SelectObject(hdcMem, hbm);
GetClientRect(hwnd, &rc);

BitBlt(hdc, 0, 0, rc.right, rc.bottom,
hdcMem, 0, 0, SRCCOPY);
CloseClipboard();
}
DeleteDC(hdcMem);
}
break;

case CF_TEXT:
if (OpenClipboard(hwnd))
{
hglb = GetClipboardData(uFormat);
lpstr = GlobalLock(hglb);

GetClientRect(hwnd, &rc);
DrawText(hdc, lpstr, -1, &rc, DT_LEFT);

GlobalUnlock(hglb);
CloseClipboard();
}
break;


case CF_ENHMETAFILE:
if (OpenClipboard(hwnd))
{
hemf = GetClipboardData(uFormat);
GetClientRect(hwnd, &rc);
PlayEnhMetaFile(hdc, hemf, &rc);
CloseCowner-displaylipboard();
}
break;

case 0:
GetClientRect(hwnd, &rc);
DrawText(hdc, "The clipboard is empty.", -1,
&rc, DT_CENTER | DT_SINGLELINE |
DT_VCENTER);
break;

default:
GetClientRect(hwnd, &rc);
DrawText(hdc, "Unable to display format.", -1,
&rc, DT_CENTER | DT_SINGLELINE |
DT_VCENTER);
}
EndPaint(hwnd, &ps);
break;

case WM_SIZE:
if (uFormat == CF_OWNERDISPLAY)

{
hwndOwner = GetClipboardOwner();
hglb = GlobalAlloc(GMEM_DDESHARE, sizeof(RECT));
lprc = GlobalLock(hglb);
GetClientRect(hwnd, lprc);
GlobalUnlock(hglb);

SendMessage(hwndOwner, WM_SIZECLIPBOARD,
(WPARAM) hwnd, (LPARAM) hglb);

GlobalFree(hglb);
}
break;

case WM_CREATE:


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

hwndNextViewer = SetClipboardViewer(hwnd);
break;

case WM_CHANGECBCHAIN:

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

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

// Иначе, передаем сообщение в следующее звено.

else if (hwndNextViewer != NULL)
SendMessage(hwndNextViewer, uMsg, wParam, lParam);
break;

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

case WM_DRAWCLIPBOARD: // буфер обмена изменил содержание.

// Модифицируем окно, используя Автоформат буфера обмена


SetAutoView(hwnd);

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

SendMessage(hwndNextViewer, uMsg, wParam, lParam);
break;

case WM_INITMENUPOPUP:
if (!HIWORD(lParam))
InitMenu(hwnd, (HMENU) wParam);
break;

case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDM_EXIT:
DestroyWindow(hwnd);
break;

case IDM_AUTO:
SetAutoView(hwnd);
break;

default:
fAuto = FALSE;
uFormat = LOWORD(wParam);
InvalidateRect(hwnd, NULL, TRUE);
}
break;

default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return (LRESULT) NULL;
}

void WINAPI SetAutoView(HWND hwnd)
{
static UINT auPriorityList[] = {
CF_OWNERDISPLAY,
CF_TEXT,
CF_ENHMETAFILE,
CF_BITMAP

};

uFormat = GetPriorityClipboardFormat(auPriorityList, 4);
fAuto = TRUE;

InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd);
}
void WINAPI InitMenu(HWND hwnd, HMENU hmenu)
{
UINT uFormat;
char szFormatName[80];
LPCSTR lpFormatName;
UINT fuFlags;
UINT idMenuItem;

// Если меню - не отображаемое меню, никакой инициализации не надо.

if (GetMenuItemID(hmenu, 0) != IDM_AUTO)
return;

// Удаляем все пункты меню за исключением первого.

while (GetMenuItemCount(hmenu) > 1)
DeleteMenu(hmenu, 1, MF_BYPOSITION);

// Проверьте или не проверяйте пункт Автоменю.

fuFlags = fAuto ? MF_BYCOMMAND | MF_CHECKED :
MF_BYCOMMAND | MF_UNCHECKED;
CheckMenuItem(hmenu, IDM_AUTO, fuFlags);

// Если не имеется никаких форматов буфера обмена, возврат из функции

if (CountClipboardFormats() == 0)
return;

// Откроем буфер обмена.

if (!OpenClipboard(hwnd))
return;

// Добавим разделитель, а затем пункт меню для каждого формата.
AppendMenu(hmenu, MF_SEPARATOR, 0, NULL);
uFormat = EnumClipboardFormats(0);

while (uFormat)
{
// Вызовем определяемую программой функцию, чтобы получить имя формата буфера обмена.
lpFormatName = GetPredefinedClipboardFormatName(uFormat);
// Для зарегистрированных форматов, получим зарегистрированное имя.

if (lpFormatName == NULL)
{
if (GetClipboardFormatName(uFormat, szFormatName,sizeof(szFormatName)))
lpFormatName = szFormatName;
else
lpFormatName = "(unknown)";
}

// Добавим пункт меню для формата.
// Для воспроизводимых форматов, используем ID формата для ID меню.


if (IsDisplayableFormat(uFormat))
{
fuFlags = MF_STRING;
idMenuItem = uFormat;
}
else
{
fuFlags = MF_STRING | MF_GRAYED;
idMenuItem = 0;
}
AppendMenu(hmenu, fuFlags, idMenuItem, lpFormatName);

uFormat = EnumClipboardFormats(uFormat);
}
CloseClipboard();

}

BOOL WINAPI IsDisplayableFormat(UINT uFormat)
{
switch (uFormat)
{
case CF_OWNERDISPLAY:
case CF_TEXT:
case CF_ENHMETAFILE:
case CF_BITMAP:
return TRUE;
}
return FALSE;
}


Справочник по Буферу обмена

Следующие функции, структуры и сообщения связаны с буфером обмена.

Функции Буфера обмена

Ниже перечислены функции, используемые с буфером обмена


Функция ChangeClipboardChain

(ИзменитьЦепочкуБуфераОбмена).

Функция ChangeClipboardChain удаляет определяемое окно из цепочки окон просмотра буфера обмена.

Синтаксис

BOOL ChangeClipboardChain
(
HWND hWndRemove, // дескриптор удаляемого окна
HWND hWndNewNext // дескриптор следующего окна
);

Параметры
hWndRemove
Идентифицирует окно, которое будет удалено из цепочки. Дескриптор должен быть передан в функцию SetClipboardViewer.
hWndNewNext
Идентифицирует окно, которое следует за hWndRemove окном в цепочке окон просмотра буфера обмена. (Это - дескриптор, возвращенный функцией SetClipboardViewer, если последовательность не была изменена в ответ на сообщение WM_CHANGECBCHAIN.

Возвращаемые значения
Возвращаемое значение указывает результат переданного сообщения WM_CHANGECBCHAIN окнам в цепочке окон просмотра буфера обмена. Поскольку окно в цепочке обычно возвращает ЛОЖЬ(FALSE), когда оно обрабатывает WM_CHANGECBCHAIN, возвращаемое значение из ChangeClipboardChain - обычно ЛОЖЬ(FALSE). Если имеется только одно окно в цепочке, возвращаемое значение - обычно ИСТИНА (TRUE).

Замечания
Окно, идентифицированное как hWndNewNext заменяет hWndRemove окно в цепочке. Функция SetClipboardViewer посылает сообщение WM_CHANGECBCHAIN первому окну в цепочке окон просмотра буфера обмена.

Смотри также
SetClipboardViewer, WM_CHANGECBCHAIN

Размещение и совместимость ChangeClipboardChain

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе WNDENUMPROC


Функция CloseClipboard

(ЗакрытьБуферОбмена).

Функция CloseClipboard закрывает буфер обмена.

Синтаксис

BOOL CloseClipboard(VOID)

Параметры
У этой функции нет параметров.

Возвращаемые значения
Если функция завершилась успешно, возвращаемое значение не нуль.
Если функция завершается с ошибкой, возвращаемое значение - ноль. Чтобы получить более подробную информацию об ошибке, обратитесь к функции GetLastError.

Замечания
Когда окно заканчивает проверку или изменяет буфер обмена, он закрывается при помощи вызова CloseClipboard. Это дает возможность другим окнам обратиться к буферу обмена.
Не помещайте объект в буфер обмена после вызова CloseClipboard.

Смотри также
GetOpenClipboardWindow, OpenClipboard

Размещение и совместимость CloseClipboard

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе WNDENUMPROC


Функция CountClipboardFormats

(ПосдчитатьФорматыБуфераОбмена)

Функция CountClipboardFormats возвращает обратно число различных форматов данных в текущем буфере обмена.

Синтаксис

int CountClipboardFormats(VOID)

Параметры
У этой функции нет параметров.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение - число различных форматов, данных в текущем в буфере обмена.
Если функция завершается с ошибкой, возвращаемое значение нулевое. Чтобы получать дополнительные данные об ошибках, вызовите функцию GetLastError.

Смотри также
EnumClipboardFormats, RegisterClipboardFormat

Размещение и совместимость CountClipboardFormats

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе WNDENUMPROC


Функция EmptyClipboard

(ОпорожнитьБуферОбмена)

Функция EmptyClipboard опорожняет буфер обмена и освобождает дескрипторы данных в буфере обмена. Затем функция назначает монопольное использование буфера обмена окну, которое в настоящее время имеет открытый буфер обмена.

Синтаксис

BOOL EmptyClipboard(VOID)

Параметры
У этой функции нет параметров.

Возвращаемые значения
Если функция завершилась успешно, возвращаемое значение не нуль.
Если функция завершилась с ошибкой, возвращаемое значение - нуль. Чтобы получить более детальную информацию об ошибке, обратитесь к функции GetLastError.

Замечания
Перед вызовом EmptyClipboard, прикладная программа должна открыть буфер обмена, используя функцию OpenClipboard. Если приложение при открытии буфера обмена определяет дескриптор окна NULL, EmptyClipboard завершается успешно, но устанавливает владельца буфера обмена как НОЛЬ (NULL).

Смотри также
OpenClipboard, SetClipboardData, WM_DESTROYCLIPBOARD

Размещение и совместимость EmptyClipboard

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Функция EnumClipboardFormats

(ПеречислитьФорматыБуфераОбмена)

Функция EnumClipboardFormats позволяет Вам перечислять форматы данных, которые являются в настоящее время доступными в буфере обмена.

Форматы данных буфера обмена хранятся в списке по порядку. Чтобы выполнить перечисление форматов данных буфера обмена, Вы делаете ряд обращений к функции EnumClipboardFormats. Для каждого обращения, параметр формата определяет доступный формат буфера обмена, а функция возвращает значение следующего доступного формата буфера обмена.

Синтаксис

UINT EnumClipboardFormats
(
UINT format // Определяет известный доступный формат буфера обмена
);

Параметры
format
Определяет формат буфера обмена, о котором известно, что он является доступным.
Чтобы начать перечисление форматов буфера обмена, установленный параметр formatformat устанавливается результат предыдущего обращения к EnumClipboardFormat.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение - формат буфера обмена, который следует за заданным форматом. Другими словами, следующий доступный формат буфера обмена.
Если функция завершается с ошибкой, возвращаемое значение нулевое. Чтобы получить дополнительные данные об ошибке, вызовите функцию GetLastError. Если буфер обмена не открыт, функция завершается с ошибкой.
Если больше нет форматов буфера обмена, которые надо перечислиться, возвращаемое значение нулевое. В этом случае, функция GetLastError возвращает значение NO_ERROR. Это позволяет Вам делать различие между функциональным сбоем и концом операции перечисления.

Замечания
Перед перечислением форматов буфера обмена, Вы должны открыть его. Чтобы открыть буфер обмена, используйте функцию OpenClipboard. Если буфер обмена не открыт, функция EnumClipboardFormats завершается с ошибкой.
Функция EnumClipboardFormats перечисляет форматы по порядку, как они были помещены в буфер обмена. Если Вы копируете информацию в буфер обмена, добавляйте объекты буфера обмена в порядке от наиболее квалифицирующего формата буфера обмена к наименее квалифицирующему формату. Если Вы вставляете информацию из буфера обмена, извлекается первый формат буфера обмена, который Вы можете обрабатывать. Это будет наиболее квалифицирующий формат буфера обмена, который Вы можете обрабатывать.
Для некоторых форматов буфера обмена, операционная система обеспечивает автоматическое преобразование типов. В случае такого формата, эта функция перечисляет заданный формат, затем перечисляет форматы, в которые он может быть преобразован. Для получения дополнительной информации о форматах буфера обмена и автоматическом преобразований типов формата буфера обмена, см. функции GetClipboardData и SetClipboardData.

Смотри также
CountClipboardFormats, GetClipboardData, OpenClipboard, RegisterClipboardFormat, SetClipboardData

Размещение и совместимость EnumClipboardFormats

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Функция GetClipboardData

(ПолучитьДанныеИзБуфераОбмена)

Функция GetClipboardData извлекает данные из буфера обмена в заданном формате. Буфер обмена, должен быть предварительно открыт.

Синтаксис

HANDLE GetClipboardData
(
UINT uFormat // формат буфера обмена
);

Параметры
uFormat
Определяет формат буфера обмена. За описанием форматов буфера обмена, обратитесь к статье о функции SetClipboardData.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение - дескриптор объекта буфера обмена в заданном формате.
Если функция завершается с ошибкой, возвращаемое значение - ПУСТО (NULL). Чтобы получить дополнительные данные об ошибке, вызовите функцию GetLastError.

Замечания
Прикладная программа может перечислять доступные форматы заранее, используя функцию EnumClipboardFormats.
Буфер обмена, а не прикладная программа, управляет дескриптором, значение которого возвращает функция GetClipboardData. Прикладная программа должна копировать данные немедленно. Программа не может надеятся на получение возможности сделать долгосрочным использование дескриптора. Прикладная программа не должна ни освобождать дескриптор, ни оставлять его заблокированным.

CF_BITMAP	CF_DIB				Windows NT, Windows 95
CF_DIB CF_BITMAP Windows NT, Windows 95
CF_DIB CF_PALETTE Windows NT, Windows 95
CF_ENHMETAFILE CF_METAFILEPICT Windows NT, Windows 95
CF_METAFILEPICT CF_ENHMETAFILE Windows NT, Windows 95
CF_OEMTEXT CF_TEXT Windows NT, Windows 95
CF_OEMTEXT CF_UNICODETEXT Windows NT
CF_TEXT CF_OEMTEXT Windows NT, Windows 95
CF_TEXT CF_UNICODETEXT Windows NT
CF_UNICODETEXT CF_OEMTEXT Windows NT
CF_UNICODETEXT CF_TEXT Windows NT

Если операционная система обеспечивает автоматическое преобразование типа в собственный формат буфера обмена, не имеется какого-либо преимущества при размещении преобразованного формата(ов) в буфере обмена.

Если буфер обмена содержит данные в формате CF_PALETTE, прикладная программа должна использовать функции SelectPalette и RealizePalette, чтобы реализовать любые другие данные в буфере обмена в замен этой логической палитры.

За дальнейшей информацией о специфических форматах данных буфера обмена обратитесь к статье о функции SetClipboardData.

Смотри также
EnumClipboardFormats, SetClipboardData, RealizePalette, SelectPalette

Размещение и совместимость GetClipboardData

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Функция GetClipboardFormatName

(ПолучитьИмяФорматаБуфераОбмена)

Функция GetClipboardFormatName извлекает из буфера обмена имя заданного зарегистрированного формата. Функция копирует имя в заданный буфер.

Синтаксис

int GetClipboardFormatName(
UINT format, // восстанавливаемый формат буфера обмена
LPTSTR lpszFormatName, // адрес буфера для имени
int cchMaxCount //длина строки имени в символах
);

Параметры
format
Определяет тип формата, который будет извлечен. Этот параметр не должен определять какой-либо из предопределенных форматов буфера обмена.
lpszFormatName
Указывает на буфер, который должен принять имя формата.
cchMaxCount
Определяет максимальную длину, в символах, строки, которая будет скопирована в буфер. Если имя превышает это ограничение, оно усекается.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение - длина, в символах, строки, скопированной в буфер.
Если функция завершается с ошибкой, возвращаемое значение нулевое, указывая, что запрошенный формат не существует или предопределен. Чтобы получать дополнительные данные об ошибке, вызовите функцию GetLastError.

Смотри также
EnumClipboardFormats, RegisterClipboardFormat

Размещение и совместимость GetClipboardFormatName

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode WinNT
Замечания по платформе Не имеется


Функция GetClipboardOwner

(ПолучитьВладельцаБуфераОбмена)

Функция GetClipboardOwner извлекает дескриптор окна текущего владельца буфера обмена.

Синтаксис

HWND GetClipboardOwner(VOID)

Параметры
У этой функции нет параметров.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение - дескриптор окна, которое владеет буфером обмена.
Если у буфера обмена нет владелеца, возвращаемое значение ПУСТО (NULL). Чтобы получить дополнительные данные об ошибке, вызовите функцию GetLastError.

Замечания
Буфер обмена может все еще содержать данные, даже если у него в настоящее время нет владельца.
Вообще, владелец буфера обмена - окно, которое самое последнее поместило данные в буфере обмена. Функция EmptyClipboard назначает монопольное использование буфера обмена.

Смотри также
EmptyClipboard, GetClipboardViewer

Размещение и совместимость GetClipboardOwner

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Функция GetClipboardViewer

(ПолучитьОкноПросмотраБуферфОбмена)

Функция GetClipboardViewer извлекает дескриптор первого окна в цепочке окон просмотра буфера обмена.

Синтаксис

HWND GetClipboardViewer(VOID)

Параметры
У этой функции нет параметров.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение - дескриптор первого окна в цепочке окон просмотра буфера обмена.
Если нет окна просмотра буфера обмена, возвращаемое значение - ПУСТО (NULL). Чтобы получать дополнительные данные об ошибке, вызовите функцию GetLastError.

Смотри также
GetClipboardOwner, SetClipboardViewer

Размещение и совместимость GetClipboardViewer

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Функция GetOpenClipboardWindow

(ПолучитьОкноОткрывшееБуферОбмена)

Функция GetOpenClipboardWindow извлекает дескриптор окна, которое в настоящее время имеет открытый буфер обмена.

Синтаксис

HWND GetOpenClipboardWindow(VOID)

Параметры
У этой функции нет параметров.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение - дескриптор окна, которое имеет открытый буфер обмена. Если нет окна, которое открыло буфера обмена, возвращаемое значение ПУСТО (NULL). Чтобы получать дополнительные данные об ошибке, вызовите функцию GetLastError.

Замечания
Если прикладная программа или динамически компонуемая библиотека (DLL) определяют дескриптор окна NULL при вызове функции OpenClipboard, буфер обмена открыт, но не связан с окном. В таком случае, GetOpenClipboardWindow возвращает значение ПУСТО (NULL).

Смотри также
GetClipboardOwner, GetClipboardViewer, GetOpenClipboardWindow, OpenClipboard

Размещение и совместимость GetOpenClipboardWindow

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Функция GetPriorityClipboardFormat

(ПолучитьПриоритетныйФорматБуфераОбмена)

Функция GetPriorityClipboardFormat возвращает значение первого доступного формата буфера обмена в заданном списке.

Синтаксис

int GetPriorityClipboardFormat(
UINT *paFormatPriorityList, // адрес списка приоритетов
int cFormats // число вводимых данных в списке
);

Параметры
paFormatPriorityList
Указывает на массив целых чисел без знака, идентифицирующих форматы буфера обмена, в приоритетном порядке. За описанием форматов буфера обмена обратитесь к статье о функции SetClipboardData.
cFormats
Устанавливает число введенных данных в массиве paFormatPriorityList. Это значение не должно быть больше, чем число вводимых данных в списке.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение - первый формат буфера обмена в списке, для которого данные являются доступными. Если буфер обмена пуст, возвращаемое значение - ПУСТО (NULL). Если буфер обмена содержит данные, но не в каком-либо из заданных форматов, возвращаемое значение - - (минус)1. Чтобы получить дополнительные данные об ошибке, обратитесь к статье о функции GetLastError.

Смотри также
CountClipboardFormats, EnumClipboardFormats, GetClipboardFormatName, IsClipboardFormatAvailable, RegisterClipboardFormat, SetClipboardData

Размещение и совместимость GetPriorityClipboardFormat

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Функция IsClipboardFormatAvailable

(ЭтоДоступныеФорматыБуфераОбмена)

Функция IsClipboardFormatAvailable определяет, содержит ли буфер обмена данные в заданном формате.

Синтаксис

BOOL IsClipboardFormatAvailable
(
UINT format // формат буфера обмена
);

Параметры
format
Определяет стандартный или зарегистрированный формат буфера обмена. За описанием форматов буфера обмена обратитесь к статье о функции SetClipboardData.

Возвращаемые значения
Если формат буфера обмена доступен, возвращаемое значение не нуль.
Если формат буфера обмена не доступен, возвращаемое значение нулевое. Чтобы получить дополнительные данные об ошибке, обратитесь статье о функции GetLastError.

Замечания
Как правило, прикладная программа, которая распознает только один формат буфера обмена, должна вызывать эту функцию при обработке сообщения WM_INITMENU или WM_INITMENUPOPUP. Затем прикладная программа включает или отключает пункт меню Вставить (Paste), в зависимости от возвращаемого значения. Прикладные программы, которые распознают больше чем один формат буфера обмена, должны для этой цели использовать функцию GetPriorityClipboardFormat.

Смотри также
CountClipboardFormats, EnumClipboardFormats, GetPriorityClipboardFormat, RegisterClipboardFormat, SetClipboardData, WM_INITMENU, WM_INITMENUPOPUP

Размещение и совместимость IsClipboardFormatAvailable

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Функция OpenClipboard

(ОткрытьБуферОбмена)

Функция OpenClipboard открывает буфер обмена для проверки содержимого и препятствует другим прикладным программам изменять содержание буфера обмена.

Синтаксис

BOOL OpenClipboard
(
HWND hWndNewOwner // дескриптор окна, открывшего буфер обмена
);

Параметры
hWndNewOwner
Идентифицирует окно, которое будет связано с открытым буфером обмена. Если этот параметр ПУСТО (NULL), открытый буфер обмена связан с текущей задачей.

Возвращаемые значения
Если функция завершилась успешно, возвращается значение отличное не нуль.
Если функция завершается с ошибкой, возвращаемое значение - ноль. Чтобы получить дополнительные данные об ошибках, обратитесь к функции GetLastError.

Замечания
Функция OpenClipboard завершается с ошибкой, если другое окно имеет открытый буфер обмена.
Прикладная программа должна вызвать функцию CloseClipboard после каждого успешного обращения к OpenClipboard.
Окно, идентифицированное параметром hWndNewOwner не станет владельцем буфера обмена, если не было обращения к функции EmptyClipboard.

Смотри также
CloseClipboard, EmptyClipboard

Размещение и совместимость OpenClipboard

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Функция RegisterClipboardFormat

(РегистрацияФорматаБуфераОбмена)

Функция RegisterClipboardFormat регистрирует новый формат буфера обмена. Этот формат может затем использоваться как допустимый формат буфера обмена.

Синтаксис

UINT RegisterClipboardFormat
(
LPCTSTR lpszFormat // адрес строки с именем
);

Параметры
lpszFormat
Указывает на строку с символом нуля в конце, которая именует новый формат.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение идентифицирует зарегистрированный формат буфера обмена.
Если функция завершается с ошибкой, возвращаемое значение нулевое. Чтобы получать дополнительные данные об ошибке, вызовите функцию GetLastError.

Замечания
Если зарегистрированный формат с заданным именем уже существует, новый формат не регистрируется, а возвращаемое значение идентифицирует существующий формат. Это дает возможность больше чем одной прикладной программе копировать и вставлять данные, использующие тот же самый зарегистрированный формат буфера обмена. Обратите внимание, что сравнение названия формата осуществляется без учета регистра.
Зарегистрированные форматы буфера обмена идентифицируются значениями в диапазоне от 0xC000 до 0xFFFF.

Смотри также
CountClipboardFormats, EnumClipboardFormats, GetClipboardFormatName

Размещение и совместимость RegisterClipboardFormat.

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode WinNT
Замечания по платформе Не имеется


Функция SetClipboardData

(УстановкаДанныхВБуферОбмена)

Функция SetClipboardData помещает данные в буфер обмена в заданном формате. Окно должно быть текущим владельцем буфера обмена, а прикладная программа, должна вызвать функцию OpenClipboard. (При ответе на сообщения WM_RENDERFORMAT и WM_RENDERALLFORMATS, владелец буфера обмена не должен вызвать OpenClipboard перед вызовом SetClipboardData.)

Синтаксис

HANDLE SetClipboardData
(
UINT uFormat, // формат буфера обмена
HANDLE hMem // дескриптор данных
);

Параметры
uFormat
Определяет формат буфера обмена. Этот параметр может быть зарегистрированным форматом или любым из стандартных форматов буфера обмена, перечисленных в ниже следующем разделе Замечания. За информацией о зарегистрированных форматах буфера обмена обратитесь к статье о функции RegisterClipboardFormat.
hMem
Идентифицирует данные в заданном формате. Этот параметр может иметь значение ПУСТО (NULL), указывая, что окно предоставляет данные в заданном формате буфера обмена (представляет формат) после запроса. Если окно задерживает его представление, оно должно обработать сообщения WM_RENDERFORMAT и WM_RENDERALLFORMATS.
Как только вызывается функция SetClipboardData, система идентифицирует владельца объекта при помощи параметра hMem. Прикладная программа может считывать данные, но не должна освобождать или оставлять заблокированным дескриптор. Если параметр hMem идентифицирует объект в памяти, объект, должен быть помещен, используя функцию GlobalAlloc с флажками GMEM_DDESHARE и GMEM_MOVEABLE.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение - дескриптор данных.
Если функция завершается с ошибкой, возвращаемое значение ПУСТО (NULL). Чтобы получить дополнительные данные об ошибке, вызовите функцию GetLastError.

Замечания
Параметр uFormat может идентифицировать зарегистрированный формат буфера обмена или он может быть одним из следующих значений:

  • CF_BITMAP - Дескриптор к точечному рисунку (HBITMAP).
  • CF_DIB - Объект в памяти содержит структуру BITMAPINFO, сопровождаемую растровыми битами.
  • CF_DIF - Формат обмена данными программы Arts'.
  • CF_DSPBITMAP - Растровый формат отображения данных на дисплее, связанный с собственным форматом. Параметр hMem должен быть дескриптором данных, которые могут отображаться в растровом формате вместо, частным образом форматируемых данных.
  • CF_DSPENHMETAFILE - Формат отображения улучшенного метафайла связанного с собственным форматом. Параметр hMem должен быть дескриптор данных, которые могут отображаться в улучшеннном формате метафайла вместо, частным образом форматируемых данных.
  • CF_DSPMETAFILEPICT - Формат отображения данных метафайла-картинки, связанного с собственным форматом. Параметр hMem должен быть дескриптором данных, которые могут отображаться в формате метафайла-картинки вместо частным образом форматируемых данных.
  • CF_DSPTEXT - Формат отображения текста, связанный с собственным форматом. Параметр hMem должен быть дескриптором данных, которые могут отображаться в текстовом формате вместо частным образом форматируемых данных.
  • CF_ENHMETAFILE - Дескриптор улучшенного метафайла (HENHMETAFILE).
  • От CF_GDIOBJFIRST до CF_GDIOBJLAST - Диапазон целочисленных значений для определяемых программой форматов буфера обмена объекта GDI. Дескрипторы, связанные с форматами буфера обмена в этом диапазоне автоматически не удаляются, при использовании функции GlobalFree, когда опорожняется буфер обмена. Также, при использовании значений в этом диапазоне, параметр hMem - не дескриптор к объекту GDI, а дескриптор, помещенный функцией GlobalAlloc с флажками GMEM_MOVEABLE и GMEM_DDESHARE.
  • CF_HDROP - Дескриптор типа HDROP - это тот, который идентифицирует список файлов. Прикладная программа может извлечь информацию о файлах, передавая дескриптор функции DragQueryFile.
  • CF_LOCALE - Данные являются дескриптором локального идентификатора, связанного с текстом в буфере обмена. Когда вы закрываете буфер обмена, если он содержит данные CF_TEXT, а не данные CF_LOCALE, система автоматически устанавливает формат CF_LOCALE в текущем месте ввода информации. Вы можете использовать формат CF_LOCALE, чтобы сопоставлять различные места действия с текстом буфера обмена. Прикладная программа, которая вставляет текст из буфера обмена, может извлечь этот формат, чтобы определить, какой набор символов использовался, чтобы создать текст. Обратите внимание, что буфер обмена не поддерживает обычный текст в многокомпонентных наборах символов. Чтобы добиться этого, взамен используйте форматированный текстовый тип данных такой как RTF. Windows NT: система использует кодовую страницу, связанную с CF_LOCALE, чтобы неявно преобразовать из CF_TEXT в CF_UNICODETEXT. Следовательно, правильная таблица кодовой страницы используется для преобразования.
  • CF_METAFILEPICT - Дескриптор метафайла изображает формат как определено структурой METAFILEPICT. При передаче дескриптора CF_METAFILEPICT посредством динамического обмена данными (прямой ввод данных (DDE)), прикладная программа, ответственная за удаление hMem должна также освободить метафайл, упоминаемый дескриптором CF_METAFILEPICT.
  • CF_OEMTEXT - Текстовый формат, содержащий символы в OEM наборе символов. Каждые строка заканчивается комбинацией возврат каретки / перевод строки (carriage return/linefeed)(CR-LF). Символ пробела сообщает о конце данных.
  • CF_OWNERDISPLAY - Собственный формат отображения данных. Владелец буфера обмена должен отображать, и модифицировать окна просмотра буфера обмена, и приннимать сообщения WM_ASKCBFORMATNAME, WM_HSCROLLCLIPBOARD, WM_PAINTCLIPBOARD, WM_SIZECLIPBOARD и WM_VSCROLLCLIPBOARD. Параметр hMem должен иметь значение ПУСТО (NULL).
  • CF_PALETTE - Дескриптор цветовой палитры. Всякий раз, когда прикладная программа помещает данные в буфер обмена, которые зависят от цветовой палитры или назначает цветовую палитру, она должна поместить в буфер обмена также и палитру. Если буфер обмена содержит данные в формате CF_PALETTE (логическая цветовая палитра), прикладная программа должна использовать функции SelectPalette и RealizePalette, чтобы реализовать ( сравнить) любые другие данные в буфере обмена в зависимости от этой логической палитры. При отображении данных буфера обмена, буфер обмена Windows всегда использует как свою текущую палитру любого объекта в буфере обмена, который находится в формате CF_PALETTE.
  • CF_PENDATA - Дополнительные данные для пера в Microsoft Windows для Pen Computing (Компьютерного пера).
  • От CF_PRIVATEFIRST до CF_PRIVATELAST - Диапазон целых значений для собственных форматов буфера обмена. Дескрипторы, связанные с собственными форматами буфера обмена автоматически не освобождаются; владелец буфера обмена должен освобождать такие дескрипторы, обычно в ответ на сообщение WM_DESTROYCLIPBOARD.
  • CF_RIFF - Представляет звуковые данные более сложные, чем они могут быть представлены в стандартном звуковом формате CF_WAVE.
  • CF_SYLK - Формат Символической Связи Microsoft (SYLK) (Microsoft Symbolic Link).
  • CF_TEXT - Текстовый формат. Каждая строка оканчивается комбинацией возврата каретки / перевода строки (CR-LF). Символ пробела сообщает о конце данных. Используйте этот формат для текста ANSI.
  • CF_WAVE - Представляет звуковые данные в одном из стандартных звуковых форматах, таких как импульсно-кодовой модуляции 11 кГц или 22 кГц (ИКМ) (PCM- pulse code modulation).
  • CF_TIFF - Формат Файла Тегированного Изображения (TIFF - Tagged-image file format).
  • CF_UNICODETEXT - Только Windows NT: Формат текста Уникода. Каждая строка оканчивается комбинацией возврата каретки / перевода строки (CR-LF). Символ пробела сообщает о конце данных.

Операционная система выполняет неявные преобразования формата данных между некоторыми форматами буфера обмена, когда прикладная программа вызывает функцию GetClipboardData. Например, если формат CF_OEMTEXT - в буфере обмена, окно может вернуть данные в формате CF_TEXT. Формат в буфере обмена преобразуется в запрошенный формат по требованию. Нижеследующая таблица показывает преобразования типов данных буфера обмена, которые являются доступными. Обратите внимание, что некоторые из этих автоматических преобразований типов не доступны на всех платформах.

Формат буфера обмена	Преобразованный формат	Поддерживающая платформа
CF_BITMAP CF_DIB Windows NT, Windows 95
CF_DIB CF_BITMAP Windows NT, Windows 95
CF_DIB CF_PALETTE Windows NT, Windows 95
CF_ENHMETAFILE CF_METAFILEPICT Windows NT, Windows 95
CF_METAFILEPICT CF_ENHMETAFILE Windows NT, Windows 95
CF_OEMTEXT CF_TEXT Windows NT, Windows 95
CF_OEMTEXT CF_UNICODETEXT Windows NT
CF_TEXT CF_OEMTEXT Windows NT, Windows 95
CF_TEXT CF_UNICODETEXT Windows NT
CF_UNICODETEXT CF_OEMTEXT Windows NT
CF_UNICODETEXT CF_TEXT Windows NT

Если операционная система обеспечивает автоматическое преобразование типов для собственного формата буфера обмена, не имеется никакого преимущества для размещения преобразованного формата(ов) в буфере обмена.
При копировании точечных рисунков, лучше всего в буфер обмена поместить только формат CF_DIB. Это делается так потому, что цвета в аппаратно-зависимом точечном рисунке (CF_BITMAP) - относятся к палитре системы, которая может измениться до того, как точечный рисунок будет вставлен. Если же в буфере обмена формат CF_DIB, а окно запрашивает формат CF_BITMAP, система представляет аппаратно-зависимый точечный рисунок, использующий текущую палитру на этот момент.
Если Вы помещаете формат CF_BITMAP в буфер обмена (а не CF_DIB), система переведет его в формат буфера обмена CF_DIB, как только буфер обмена будет закрыт. Это гарантия того, что используется правильная палитра, чтобы создать не зависящий от устройства точечный рисунок (DIB). Преобразования между другими форматами буфера обмена происходят после запроса.
Платформы Windows поддерживают два формата буфера обмена для метафайлов: CF_ENHMETAFILE и CF_METAFILEPICT. Устанавливайте CF_ENHMETAFILE для расширенных метафайлов и CF_METAFILEPICT для метафайлов Windows.

Смотри также
BITMAPINFO, GetClipboardData, GlobalAlloc, GlobalFree, METAFILEPICT, OpenClipboard, RealizePalette, RegisterClipboardFormat, SelectPalette, WM_ASKCBFORMATNAME, WM_DESTROYCLIPBOARD, WM_HSCROLLCLIPBOARD, WM_PAINTCLIPBOARD, WM_RENDERFORMAT, WM_RENDERALLFORMATS, WM_SIZECLIPBOARD, WM_VSCROLLCLIPBOARD

Размещение и совместимость SetClipboardData

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Функция SetClipboardViewer

(УстановитьОкноПросмотраБуфераОбмена)

Функция SetClipboardViewer добавляет определяемое окно к цепочке окон просмотра буфера обмена. Окна просмотра буфера обмена принимают сообщение WM_DRAWCLIPBOARD всякий раз, когда содержание буфера обмена изменяется.

Синтаксис

HWND SetClipboardViewer
(
HWND hWndNewViewer // дескриптор окна просмотра буфера обмена
);

Параметры
hWndNewViewer
Идентифицирует окно, которое будет добавлено к цепочке буферов обмена.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение идентифицирует следующее окно в цепочке окон просмотра буфера обмена. Если происходит ошибка или не имеется никаких других окон в цепочке окон просмотра буфера обмена, возвращаемое значение ПУСТО (NULL). Чтобы получать дополнительные данные об ошибке, вызовите функцию GetLastError.

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

Смотри также
ChangeClipboardChain, GetClipboardViewer, SendMessage, WM_CHANGECBCHAIN, WM_DRAWCLIPBOARD

Размещение и совместимость SetClipboardViewer

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Структуры буфера обмена

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


Структура METAFILEPICT

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

Синтаксис

typedef struct tagMETAFILEPICT { 	// mfp
LONG mm;
LONG xExt;
LONG yExt;
HMETAFILE hMF;
} METAFILEPICT;

Элементы
mm
Устанавливает режим отображения, в котором рисуется изображение.
xExt
Определяет размер изображения в метафайле для всех режимов за исключением режимов MM_ISOTROPIC и MM_ANISOTROPIC. (Для получения дополнительной информации об этих режимах, см. элемент yExt.) Величина x устанавливает ширину прямоугольника, внутри рисуется изображение. Координаты исчисляются в единицах, которые соответствуют режиму отображения.
yExt
Определяет размер изображения в метафайле для всех режимов за исключением режимов MM_ISOTROPIC и MM_ANISOTROPIC. Величина y устанавливает высоту прямоугольника, внутри которого рисуется изображение. Координаты исчисляются в единицах, которые соответствуют режиму отображения. Для режимов MM_ISOTROPIC и MM_ANISOTROPIC, которые могут масштабироваться, элементы xExt и yExt содержат необязательный рекомендуемый размер в единицах измерения MM_HIMETRIC. Для изображений MM_ANISOTROPIC, элементы xExt и yExt могут быть нулевыми, когда никакой предлагаемый размер не обеспечивается. Для изображений MM_ISOTROPIC, отношение сторон изображения должно быть обеспечено даже тогда, когда никакой рекомендованный размер не дан. (Если предложенный размер дан, отношение сторон изображения - величина вычисляемая из предполагаемых размеров.) Чтобы дать отношение сторон изображения без учета складывающихся обстоятельств для предложенного размера, установите элементы xExt и yExt с отрицательными значениями, отношение которых соответствует отношению сторон изображения. Отрицательные величины значений xExt и yExt игнорируются; используется только отношение.
hMF
Идентифицирует метафайл в памяти.

Смотри также
SetClipboardData

Размещение и совместимость METAFILEPICT

Windows NT			Да 
Win95 Да
Win32s Нет
Импортируемая библиотека
Заголовочный файл wingdi.h
Unicode Нет
Замечания по платформе Не имеется


Сообщения Буфера Обмена

С буфером обмена используются ниже следующие сообщения


Сообщение WM_ASKCBFORMATNAME

Сообщение WM_ASKCBFORMATNAME посылается владельцу буфера обмена окном просмотра буфера обмена, чтобы запросить имя формата CF_OWNERDISPLAY.

Синтаксис

WM_ASKCBFORMATNAME
cchName = (DWORD) wParam // размер буфера
lpszFormatName = (LPTSTR) lParam // буфер, который принимает название формата

Параметры
cchName
Значение wParam. Определяет размер, в символах, буфера, указанного параметром lpszFormatName.
lpszFormatName
Значение lParam. Указывает на буфер, который должен принять название формата буфера обмена.

Возвращаемые значения
Если приложение обрабатывает это сообщение, оно возвращает нуль.

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

Размещение и совместимость WM_ASKCBFORMATNAME

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Сообщение WM_CHANGECBCHAIN

Сообщение WM_CHANGECBCHAIN посылается к первому окну в цепочке окон просмотра буфера обмена, когда окно удаляется из цепочки.

Синтаксис

WM_CHANGECBCHAIN
hwndRemove = (HWND) wParam; // дескриптор удаляемого окна
hwndNext = (HWND) lParam; // дескриптор следующего окна в цепочке

Параметры
hwndRemove
Значение wParam. Идентифицирует окно, удаляемое из цепочки окон просмотра буфера обмена. hwndNext
Значение lParam. Идентифицирует следующее окно в цепочке после удаляемого окна. Этот параметр имеет значение ПУСТО (NULL), если удаляемое окно - последнее окно в цепочке.

Возвращаемые значения
Если программа обрабатывает это сообщение, она должна возвратить ноль.

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

Смотри также
SendMessage, SetClipboardViewer

Размещение и совместимость WM_CHANGECBCHAIN

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Сообщение WM_CLEAR

Прикладная программа передает сообщение WM_CLEAR средствам редактирования или комбинированному блоку, чтобы удалить (очистить) текущий выбор, если таковой вообще имеется, из окна редактирования.

Синтаксис

WM_CLEAR
wParam = 0; // не используется, должно быть ноль
lParam = 0; // не используется, должно быть ноль

Параметры
У этого сообщения нет параметров.

Возвращаемые значения
Это сообщение не возвращает значений.

Замечания
Удаление, выполняемое в соответствии с сообщением WM_CLEAR, может быть отменено путем передачи сообщения EM_UNDO окну редактирования.
Чтобы удалить текущий выбор и поместить удаляемое содержимое в буфер обмена, используют сообщение WM_CUT.
Когда сообщение WM_CLEAR посылается комбинированному блоку, оно обрабатывается его средствами редактирования. Это сообщение не оказывает никакого влияния, когда оно послано комбинированному блоку со стилем CBS_DROPDOWNLIST.

Смотри также
EM_UNDO, WM_COPY, WM_CUT, WM_PASTE

Размещение и совместимость WM_CLEAR

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Сообщение WM_COPY

Прикладная программа посылает сообщение WM_COPY окнам редактирования или комбинированному блоку, чтобы копировать текущий выбор в буфер обмена в формате CF_TEXT.

Синтаксис

WM_COPY
wParam = 0; // не используется, должно быть ноль
lParam = 0; // не используется, должно быть ноль

Параметры
У этого сообщения нет параметров.

Возвращаемые значения
Это сообщение не возвращает значений.

Замечания
Когда сообщение WM_COPY посылается комбинированному блоку, оно обрабатывается его средствами редактирования. Это сообщение не оказывает никакого влияния, когда послано комбинированному блоку со стилем CBS_DROPDOWNLIST.

Смотри также
WM_CLEAR, WM_CUT, WM_PASTE

Размещение и совместимость WM_COPY

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Сообщение WM_CUT

Прикладная программа передает сообщение WM_CUT средству редактирования или комбинированному блоку, чтобы удалить (вырезать) текущий выбор, если таковой имеется в средстве редактирования, а удаленный текст скопировать в буфер обмена в формате CF_TEXT.

Синтаксис

WM_CUT
wParam = 0; // не используется; должен быть ноль
lParam = 0; // не используется; должен быть ноль

Параметры
У этого сообщения нет параметров.

Возвращаемые значения
У этого сообщения нет возвращаемых значений

Замечания
Удаление, выполненное в соответствии с сообщением WM_CUT может быть отменено, при помощи передачи средству редактирования сообщение EM_UNDO.
Чтобы удалить текущий выбор без помещения удаленного текста в буфер обмена, используйте сообщение WM_CLEAR.
Когда сообщение WM_CUT передано комбинированному блоку, он обрабатывает его средствами редактирования. Это сообщение не оказывает никакого влияния, когда передается комбинированному блоку со стилем CBS_DROPDOWNLIST.

Смотри также
EM_UNDO, WM_CLEAR, WM_COPY, WM_PASTE

Размещение и совместимость WM_CUT

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека -
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Сообщение WM_DESTROYCLIPBOARD

Сообщение WM_DESTROYCLIPBOARD посылается владельцу буфера обмена, когда обращение к функции EmptyClipboard очищает буфер обмена.

Синтаксис
WM_DESTROYCLIPBOARD

Параметры
У этого сообщения нет параметров.

Возвращаемые значения
Если приложение обрабатывает это сообщение, оно должно возвратить ноль.

Смотри также
EmptyClipboard

Размещение и совместимость WM_DESTROYCLIPBOARD

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека -
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Сообщение WM_DRAWCLIPBOARD

Сообщение WM_DRAWCLIPBOARD посылается первому окну в цепочке окон просмотра буфера обмена, когда изменяется содержание буфера обмена. Это дает возможность окну просмотра буфера обмена отобразить его новое содержание.

Синтаксис

WM_DRAWCLIPBOARD

Параметры
У этого сообщения нет параметров.

Замечания
Только окна просмотра буфера обмена принимают это сообщение. Они - окна, которые были добавлены к цепочке окон просмотра буфера обмена, при помощи использования функции SetClipboardViewer.
Каждое окно, которое принимает сообщение WM_DRAWCLIPBOARD, должно вызвать функцию SendMessage, чтобы передать сообщение следующему окну в цепочке окон просмотра буфера обмена. Дескриптор следующего окна в цепочке возвращается в SetClipboardViewer и может изменяться в ответ на сообщение WM_CHANGECBCHAIN.

Смотри также
SendMessage, SetClipboardViewer, WM_CHANGECBCHAIN

Размещение и совместимость WM_DRAWCLIPBOARD

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека -
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Сообщение WM_HSCROLLCLIPBOARD

Сообщение WM_HSCROLLCLIPBOARD посылается владельцу окна просмотра буфера обмена. Это происходит тогда, когда буфер обмена содержит данные в формате CF_OWNERDISPLAY, а событие происходит в горизонтальной полосе прокрутки окна просмотра буфера обмена. Владелец прокручивает изображение в буфере обмена и модифицирует значения полосы прокрутки.

Синтаксис

WM_HSCROLLCLIPBOARD
hwndViewer = (HWND) wParam; // дескриптор окна просмотра буфера обмена
nScrollCode = (int) LOWORD(lParam); // код полосы прокрутки
nPos = (int) HIWORD(lParam); // позиция бегунка

Параметры
hwndViewer
Значение wParam. Идентифицирует окно просмотра буфера обмена.
nScrollCode
Значение младшего байта слова lParam. Устанавливает событие полосы прокрутки. Этот параметр может быть одним из следующих значений:

  • SB_BOTTOM - Прокрутка вниз вправо.
  • SB_ENDSCROLL - Конец прокрутки.
  • SB_LINEDOWN - Прокрутка на одну строку вниз.
  • SB_LINEUP - Прокрутка на одну сроку вверх.
  • SB_PAGEDOWN - Прокрутка на одну страницу вниз.
  • SB_PAGEUP - Прокрутка на одну страницу вверх.
  • SB_THUMBPOSITION - Прокрутка в начальную позицию. Текущая позиция установлена параметром nPos.
  • SB_TOP - Прокрутка вверх влево.

nPos
Значение старшего слова lParam. Устанавливает текущую позицию бегунка, если параметр nScrollCode - SB_THUMBPOSITION; иначе, nPos параметр не используется.

Возвращаемые значения
Если приложение обрабатывает это сообщение, оно должно возвратить ноль.

Замечания
Владелец буфера обмена может использовать функцию ScrollWindow, чтобы листать изображение в окне просмотра буфера обмена и признать недействительной соответствующую область.

Смотри также
ScrollWindow

Размещение и совместимость WM_HSCROLLCLIPBOARD

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека -
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Сообщение WM_PAINTCLIPBOARD

Сообщение WM_PAINTCLIPBOARD посылается владельцу буфера обмена окном просмотра, когда буфер обмена содержит данные в формате CF_OWNERDISPLAY и рабочая область окна просмотра буфера обмена нуждается в перерисовке.

Синтаксис

WM_PAINTCLIPBOARD
hwndViewer = (HWND) wParam; // дескриптор окна просмотра буфера обмена
hglbPs = (HGLOBAL) lParam; // дескриптор объекта PAINTSTRUCT

Параметры
hwndViewer
Значение wParam. Идентифицирует окно просмотра буфера обмена.
hglbPs
Значение lParam. Идентифицирует глобальный объект DDESHARE, который содержит структуру PAINTSTRUCT. Структура определяет часть рабочей области для прорисовки.

Возвращаемые значения
Если приложение обрабатывает это сообщение, оно возвращает нуль.

Замечания
Чтобы определить, нужно ли перерисовывать всю рабочую область или только ее часть, владелец буфера обмена сравнивает размеры области прорисовки, которые даны в элементе rcpaint структуры PAINTSTRUCT, с размерами, данным в самом свежем сообщении WM_SIZECLIPBOARD.
Владелец буфера обмена должен использовать функцию GlobalLock, чтобы блокировать память, которая содержит структуру PAINTSTRUCT. Перед возвратом из функции, владелец буфера обмена должен разблокировать эту память, используя функцию GlobalUnlock.

Смотри также
GlobalLock, GlobalUnlock, PAINTSTRUCT, WM_SIZECLIPBOARD

Размещение и совместимость WM_PAINTCLIPBOARD

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека -
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Сообщение WM_PASTE

Прикладная программа посылает сообщение WM_PASTE средствам редактирования или комбинированному блоку, чтобы копировать текущее содержание буфера обмена в текущую позицию каретки окна редактирования. Данные вставляются только тогда, если буфер обмена содержит данные в формате CF_TEXT.

Синтаксис

WM_PASTE
wParam = 0; // не используется, должно быть нуль
lParam = 0; // не используется, должно быть нуль

Параметры
У этого сообщения нет параметров.

Возвращаемые значения
Это сообщение не возвращает значение.

Замечания
Когда сообщение WM_PASTE посылается комбинированному блоку, оно обрабатывается его средствами редактирования. Это сообщение не имеет никакого влияния, когда послано комбинированному блоку со стилем CBS_DROPDOWNLIST.
Смотри также
WM_CLEAR, WM_COPY, WM_CUT

Размещение и совместимость WM_PASTE

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека -
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Сообщение WM_RENDERALLFORMATS

Сообщение WM_RENDERALLFORMATS посылается владельцу буфера обмена, перед тем как его разрушить, если владелец буфера обмена отложил запись одного или большего количества форматов. Для содержания буфера обмена, чтобы ему остаться доступным другим прикладным программам, владелец буфера обмена должен представить данные во всех его форматах, способных к действию и поместить данные в буфер обмена, путем вызова функции SetClipboardData.

Синтаксис
WM_RENDERALLFORMATS

Параметры
У этого сообщения нет параметров.

Возвращаемые значения
Если приложение обрабатывает это сообщение, оно возвращает нуль.

Замечания
При ответе на сообщение WM_RENDERALLFORMATS, владелец буфера обмена перед вызовом функции SetClipboardData должен вызвать функции OpenClipboard и EmptyClipboard.
Когда прикладная программа возвращается из функции, система удаляет любые не представленные форматы из списка доступных форматов буфера обмена. За информацией об отложенной записи обратитесь к статье о функции SetClipboardData.

Смотри также
EmptyClipboard, OpenClipboard, SetClipboardData, WM_RENDERFORMAT

Размещение и совместимость WM_RENDERALLFORMATS

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека -
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Сообщение WM_RENDERFORMAT

Сообщение WM_RENDERFORMAT посылается владельцу буфера обмена, если он отложил запись специфического формата буфера обмена и, если прикладная программа запросила данные в этом формате. Владелец буфера обмена должен представить данные в запрошенном формате и поместить их в буфер обмена, путем вызова функции SetClipboardData.

Синтаксис

WM_RENDERFORMAT
uFormat = (UINT) wParam; // формат буфера обмена

Параметры
uFormat
Устанавливает формат буфера обмена, который будет представлен.

Возвращаемые значения
Если приложение обрабатывает это сообщение, оно возвращает нуль.

Замечания
При ответе на сообщение WM_RENDERFORMAT, владелец буфера обмена не должен открывать буфер обмена перед вызовом функции SetClipboardData.

Смотри также
SetClipboardData, WM_RENDERALLFORMATS

Размещение и совместимость WM_RENDERFORMAT

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека -
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Сообщение WM_SIZECLIPBOARD

Сообщение WM_SIZECLIPBOARD посылается владельцу буфера обмена окном просмотра, когда буфер обмена содержит данные в формате CF_OWNERDISPLAY, а рабочая область окна просмотра буфера обмена изменила размеры.

Синтаксис

WM_SIZECLIPBOARD
hwndViewer = (HWND) wParam; // дескриптор окна просмотра буфера обмена
hglbRc = (HGLOBAL) lParam; // дескриптор объекта структуры RECT

Параметры
hwndViewer
Значение wParam. Идентифицирует окно окна просмотра буфера обмена.
hglbRc
Значение lParam. Идентифицирует глобальный объект в памяти, который содержит структуру RECT. Структура определяет новые габариты рабочей области окна просмотра буфера обмена.

Замечания
Когда окно просмотра буфера обмена собирается быть разрушенным или измененным, сообщение WM_SIZECLIPBOARD посылается с нулевым прямоугольником (0, 0, 0, 0) в качестве нового размера. Это позволяет владельцу буфера обмена освободить свои ресурсы дисплея.
Владелец буфера обмена должен использовать функцию GlobalLock, чтобы блокировать объект в памяти, который содержит RECT. Перед возвратом из функции, владелец буфера обмена должен разблокировать объект, используя функцию GlobalUnlock.

Смотри также
GlobalLock, GlobalUnlock, RECT

Размещение и совместимость WM_SIZECLIPBOARD

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека -
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Сообщение WM_VSCROLLCLIPBOARD

Сообщение WM_VSCROLLCLIPBOARD посылается владельцу буфера обмена окном просмотра, когда буфер обмена содержит данные в формате CF_OWNERDISPLAY, а событие происходит в вертикальной полосе прокрутки окна просмотра. Владелец должен прокрутить изображение в буфере обмена и модифицировать значения полосы прокрутки.

Синтаксис

WM_VSCROLLCLIPBOARD
hwndViewer = (HWND) wParam; // дескриптор окна просмотра буфера обмена
nScrollCode = (int) LOWORD(lParam); // код полосы прокрутки
nPos = (int) HIWORD(lParam); // позиция бегунка

Параметры
hwndViewer
Значение wParam. Идентифицирует окно просмотра буфера обмена.
nScrollCode
Значение младшего байта слова lParam. Определяет событие полосы прокрутки. Этот параметр может быть одним из следующих значений:

  • SB_BOTTOM - Прокрутка вниз вправо. (Речь идет о каретке)
  • SB_ENDSCROLL - Конец прокрутки.
  • SB_LINEDOWN - Прокрутка на одну строку вниз.
  • SB_LINEUP - Прокрутка на одну сроку вверх.
  • SB_PAGEDOWN - Прокрутка на одну страницу вниз.
  • SB_PAGEUP - Прокрутка на одну страницу вверх.
  • SB_THUMBPOSITION - Прокрутка в начальную позицию. Текущая позиция установлена параметром nPos.
  • SB_TOP - Прокрутка вверх влево.

nPos
Значение старшего слова lParam. Определяет текущую позицию бегунка, если nScrollCode параметр SB_THUMBPOSITION; иначе, параметр nPos не используется.

Возвращаемые значения
Если приложение обрабатывает это сообщение, оно возвращает нуль.

Замечания
Владелец буфера обмена может использовать функцию ScrollWindow, чтобы листать изображение в окне просмотра буфера обмена и признать недействительной соответствующую область.

Смотри также
ScrollWindow

Размещение и совместимость WM_VSCROLLCLIPBOARD

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека -
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется