Обмен данными через Clipboard
2.1.
2.2.
2.3.
2.4.
2.5.
2.6.
В этой главе мы расскажем вам о важной компоненте операционной системы Windows - об универсальном буфере обмена Clipboard. Как пользователь Windows вы, безусловно, знаете, что Clipboard предназначен для обмена информацией между различными приложениями Windows. Например, вы можете "вырезать" из графического изображения, редактируемого приложением Paintbrush, произвольный фрагмент и вставить его в документ, созданный в текстовом процессоре Microsoft Word for Windows или в ячейку электронной таблицы, созданной с помощью Microsoft Excel.
Мы называем Clipboard универсальным буфером обмена, так как пользователь может записать в него самую различную информацию.
Методика работы с Clipboard одинакова для всех приложений и обычно заключается в том, что пользователь выделяет нужную часть документа или изображения, а затем выбирает из меню "Edit" строки "Copy" или "Cut". В первом случае выделенный фрагмент копируется в Clipboard, во втором - также копируется, но после копирования фрагмент удаляется из документа.
Для вставки фрагмента из Clipboard в документ пользователь выбирает строки "Paste" или "Paste Special..." из меню "Edit". Назначение строки "Paste" вроде бы понятно - она используется для вставки фрагмента из Clipboard в документ. Чтобы понять для чего нужна загадочная строка "Paste Special...", а заодно и уточнить действие строки "Paste", проведем небольшой эксперимент.
Запустите приложение Paintbrush и загрузите в него любое изображение (либо нарисуйте что-нибудь сами). Выделите фрагмент изображения и скопируйте его в Clipboard, выбрав из меню "Edit" строку "Copy". Затем запустите приложение Clipboard или ClipBook Viewer (если вы работаете в Windows for Workgroups). Это приложение предназначено для просмотра содержимого универсального буфера обмена Clipboard.
В нижней части меню "View" вы увидите несколько строк, позволяющих выбрать формат отображения фрагмента, записанного в Clipboard (рис. 2.1).
Рис. 2.1. Выбор формата отображения
В нашем случае вы сможете выбрать либо формат по умолчанию "Default Format", формат "Bitmap" или "Picture".
Выполнив аналогичный эксперимент с другим приложением, вы можете убедиться, что набор доступных форматов просмотра меняется в зависимости от того, с помощью какого приложения вы записали фрагмент в Clipboard, а также от того, что этот фрагмент из себя представляет (графическое изображение, текст, звук, видео и т. д.).
Фактически приложения записывают данные в Clipboard одновременно в нескольких форматах. Например, Paintbrush записывает в Clipboard изображение в виде объекта, предназначенного для вставки в документ по технологии OLE, в виде битового изображения DDB, а также в виде метафайла.
Когда пользователь вставляет содержимое Clipboard в документ, приложение может выбирать наиболее подходящий формат. В некоторых случаях выбор оставляется за пользователем. Для того чтобы при вставке фрагмента указать формат данных явным образом, пользователь должен выбрать из меню "Edit" строку "Paste Special...". В результате на экране появляется диалоговая панель, с помощью которой можно сделать выбор (рис.2.2). Заметим, что не каждое приложение предоставляет пользователю возможность выбора формата данных при вставке из Clipboard, поэтому, работая с некоторыми приложениями, вы можете и не найти строку "Paste Special..." в меню "Edit".
Рис. 2.2. Диалоговая панель "Paste Special" в приложении Microsoft Word for Windows версии 2.2.
Таким образом, Clipboard может содержать данные одновременно в нескольких форматах. Что это за форматы?
Во-первых, приложение может записать в Clipboard данные в одном из форматов, предопределенных для Windows. Можно записать данные в текстовом формате, битовое изображение в формате, зависящем от устройства отображения (DDB), цветовую палитру, битовое изображение в формате, независящем от устройства отображения (DIB), в виде метафайла, а также в нескольких других форматах, созданных на базе текстового формата данных.
Во-вторых, приложение может использовать свой собственный, уникальный формат данных, зарегистрировав его в Windows при помощи специальной функции. Например, текстовый редактор Microsoft Write, который входит в дистрибутив Windows, хранит в Clipboard текст вместе с атрибутами форматирования, используя для этого свой собственный формат данных.
Сразу возникает вопрос: а сможет ли приложение Clipboard или ClipBook из Windows for Workgroups (либо другое приложение, предназначенное для просмотра содержимого Clipboard) отображать данные, которые находятся в нестандартном формате?
Самостоятельно - нет, так как откуда это приложение узнает способ отображения? Но приложение, зарегистрировавшее нестандартный формат данных для Clipboard может помочь в этом приложению, показывающему содержимое Clipboard. Когда приложение Clipboard или ClipBook приступит к рисованию нестандартных данных, оно пошлет сообщение тому приложению, которое зарегистрировало этот формат данных. После этого приложение, владеющее нестандартным форматом, должно само нарисовать данные в окне приложения Clipboard или ClipBook (рис. 2.3).
Рис. 2.3. Содержимое Clipboard нарисовано приложением Microsoft Write
Словом, если ваше приложение использует для Clipboard нестандартный формат данных, будьте готовы изобразить эти данные после прихода соответствующего сообщения от приложения, предназначенного для просмотра Clipboard.
Прежде чем приступить к подробному описанию методов работы с Clipboard, расскажем еще об одной интересной возможности - отложенной записи данных в Clipboard.
Чтобы понять, что такое отложенная запись, разберемся вначале с обычной записью данных.
Как вы думаете, где хранятся данные, записанные в Clipboard?
Очевидно, в памяти. Но в какой? Эта память должна быть доступна для всех приложений. Кроме того, содержимое памяти не должно исчезать при завершении работы отдельных приложений.
Например, вы можете запустить Paintbrush, скопировать из него фрагмент изображения в Clipboard, затем завершить работу приложения Paintbrush и запустить Word for Windows.
Несмотря на то, что приложение Paintbrush не запущено, Clipboard по-прежнему содержит фрагмент изображения, который можно вставить в документ, редактируемый с помощью Word for Windows.
Всем перечисленным выше требованиям удовлетворяет глобальная память, принадлежащая операционной системе Windows. Такая память должна иметь атрибут GMEM_DDESHARE.
Следовательно, когда приложение записывает данные в Clipboard, размер оперативной памяти, доступной другим приложениям, уменьшается. Причем уменьшается достаточно сильно, если выполняется запись графического изображения, так как данные сохраняются одновременно в нескольких форматах. Для каждого формата может потребоваться несколько сотен Кбайт памяти.
Когда какое-либо приложение вставляет данные из Clipboard, оно использует только один из имеющихся там форматов. Остальные форматы данных могут так и не потребоваться.
Механизм отложенной записи данных экономит оперативную память. В момент, когда пользователь копирует данные в Clipboard, при отложенной записи никакой передачи данных не происходит, хотя Clipboard отмечается как содержащий эти данные в одном или нескольких форматах. Когда какому-либо приложению потребуется тот или иной формат данных, приложение, записавшее в Clipboard данные, получает сообщение о необходимости выполнения фактической записи данных и предоставляет данные в нужном формате "потребителю".
Таким образом, данные сохраняются в глобальной памяти только тогда, когда в этом появилась необходимость, и только в том формате, который нужен приложению, читающему содержимое Clipboard.
Если же приложение, выполнившее отложенную запись, завершает свою работу, оно должно записать данные в Clipboard во всех возможных форматах. Иначе как их потом оттуда взять?
И еще одно замечание.
Содержимым Clipboard должен управлять пользователь и только пользователь.
Все действия с Clipboard должны выполняться только тогда, когда пользователь выбирает соответствующие строки из меню "Edit", нажимает на клавиши-акселераторы, кнопки органа управления Toolbar, дублирующие эти строки, или пользуется другими органами управления, специально предназначенными для работы с Clipboard.Ни в коем случае не следует очищать Clipboard при запуске вашего приложения или выполнять с Clipboard другие, нестандартные и неожиданные для пользователя действия.