C ++: Как мне скопировать несколько объектов в буфер обмена и извлечь их после него? - PullRequest
4 голосов
/ 14 мая 2011

Мне нужно скопировать строку и растровое изображение в буфер обмена.Я реализовал копирование строки:

if(OpenClipboard(NULL))
{
HGLOBAL clipbuffer;
char * buffer;
EmptyClipboard();
clipbuffer = GlobalAlloc(GMEM_DDESHARE, strlen(source)+1);
buffer = (char*)GlobalLock(clipbuffer);
strcpy(buffer, LPCSTR(source));
GlobalUnlock(clipbuffer);
SetClipboardData(CF_TEXT,clipbuffer);
CloseClipboard();
}

Я тоже умею копировать изображение , но мне нужно скопировать эти два объекта за один раз достать их в другом процессе).Пожалуйста, совет

Ответы [ 5 ]

2 голосов
/ 14 мая 2011

Если вы спрашиваете о том, как поместить изображение и строку в буфер обмена таким образом, чтобы при вставке в Microsoft Word отображались оба варианта, вы почти наверняка захотите поместить данные в буфер обмена в расширенном текстовом формате.

Я не могу найти хороший пример кода, который делает это на низком уровне, используя CF_RTF. Более простой высокоуровневый способ - заполнить невидимый элемент управления Rich Text нужным элементом, выбрать его и запустить копию. Я лично использовал бы для этого Qt:

http://doc.qt.nokia.com/latest/qtextedit.html#copy

Вы можете зарегистрировать пользовательский формат ...

http://msdn.microsoft.com/en-us/library/ms649013(v=vs.85).aspx#_win32_Registered_Clipboard_Formats

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

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

http://msdn.microsoft.com/en-us/library/aa366551(v=vs.85).aspx

(Примечание. Если вы чувствуете, что действительно глупы, написали обе программы и не хотите регистрировать формат ... вы можете кодировать Base64 как растровое изображение в виде строки, а затем склеить его вместе с текст, чтобы сделать единственную строку, через которую вы проходите. Затем разделите ее на части и расшифруйте на принимающей стороне.)

2 голосов
/ 14 мая 2011

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

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

Если, однако, единственное, что вы хотите сделать, это скопировать только изображение и только растровое изображение одновременно, то вы 'Вы в значительной степени прикручены, так как буфер обмена просто не может этого сделать.Когда вы выбираете фрагмент текста с изображениями, он обычно копируется как гипер- / richtext.

0 голосов
/ 26 мая 2011

Вы определенно можете сделать это.Скопируйте растровое изображение в буфер обмена, как обычно.Затем, не очищая буфер обмена, снова вызовите SetClipboardData, чтобы поместить туда текст.Теперь у вас будет буфер обмена «Франкенштейн», который можно вставить в виде текста или растрового изображения, чтобы получить данные в любом формате.У меня была интересная ситуация около 10 лет назад, когда очень популярный редактор HTML не смог очистить буфер обмена (вообще) при копировании данных.Поэтому, если вы ранее скопировали растровое изображение, а затем начали использовать этот редактор и вставили его в какое-то другое приложение, вы получите совершенно разные результаты в зависимости от того, вставили ли вы в текстовое приложение (например, в блокнот) графическуюпрограмма (например, рисование), или что-то, что может пойти в любую сторону (например, Word).

0 голосов
/ 16 мая 2011

Ответ зависит от того, куда вы вставляете, и что вы хотите вставить.

Если вам нужно вставить изображение с текстовой меткой, тогда +1 для RTF.Это действительно простой текстовый формат: если вам нужна только строка текста и небольшое изображение, вы должны иметь возможность построить его, например, с помощью дюжины вызовов CStringA :: AppendFormat (не забывайте кодировать символы не-ASCII как"\ ихххх").Я обычно использую встроенное в Windows приложение Wordpad для создания и форматирования документа, а затем использую этот крошечный RTF в качестве шаблона для создания RTF из моих собственных данных (Microsoft Word сохраняет большие и более сложные документы RTF). Википедия говорит, что RTF поддерживает 8 форматов изображений, включая jpeg и png.

Если, однако, вам нужно вставить 2 файла (один txt другой, например jpeg), то сначала вы должны либо записать их на HDDили вы должны связываться с объектами данных оболочки, реализовывать интерфейсы IDataObject и IAsyncOperation и т. д.

0 голосов
/ 14 мая 2011

Вы можете использовать CF_DIB, чтобы поместить свое изображение в буфер обмена.Когда вам нужно получить данные, используйте формат CF_TEXT или CF_DIB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...