Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье показано, как добавить код языка разметки Hypertext (HTML) в буфер обмена Microsoft Windows с помощью Visual C++.
Исходная версия продукта: Visual C++
Исходный номер базы знаний: 274308
Итоги
В этой статье приведен пример функции, которую можно использовать в приложениях для упрощения процесса добавления HTML-кода в буфер обмена.
Формат буфера обмена HTML
HTML имеет собственный формат буфера обмена с именем HTML Format (CF_HTML), который можно использовать для предоставления данных другим приложениям, таким как Excel, Word или другие Приложение Office ликации.
CF_HTML является полностью текстовым форматом, который включает описание, контекст и фрагмент в этом контексте. При сборке данных для отправки в буфер обмена необходимо включить описание данных, чтобы указать версию буфера обмена и смещения для контекста и фрагмента. Вычисление смещения может быть сложной частью. Однако для упрощения этой задачи можно использовать следующую подпрограмму.
Дополнительные сведения см. в разделе "Формат буфера обмена HTML".
Пример кода
// CopyHtml() - Copies given HTML to the clipboard.
// The HTML/BODY blanket is provided, so you only need to
// call it like CallHtml("<b>This is a test</b>");
void CopyHTML(char *html)
{
// Create temporary buffer for HTML header...
char *buf = new char [400 + strlen(html)];
if(!buf) return;
// Get clipboard id for HTML format...
static int cfid = 0;
if(!cfid) cfid = RegisterClipboardFormat("HTML Format");
// Create a template string for the HTML header...
strcpy(buf,
"Version:0.9\r\n"
"StartHTML:00000000\r\n"
"EndHTML:00000000\r\n"
"StartFragment:00000000\r\n"
"EndFragment:00000000\r\n"
"<html><body>\r\n"
"<!--StartFragment -->\r\n");
// Append the HTML...
strcat(buf, html);
strcat(buf, "\r\n");
// Finish up the HTML format...
strcat(buf,
"<!--EndFragment-->\r\n"
"</body>\r\n"
"</html>");
// Now go back, calculate all the lengths, and write out the
// necessary header information. Note, wsprintf() truncates the
// string when you overwrite it so you follow up with code to replace
// the 0 appended at the end with a '\r'...
char *ptr = strstr(buf, "StartHTML");
wsprintf(ptr+10, "%08u", strstr(buf, "<html>") - buf);
*(ptr+10+8) = '\r';
ptr = strstr(buf, "EndHTML");
wsprintf(ptr+8, "%08u", strlen(buf));
*(ptr+8+8) = '\r';
ptr = strstr(buf, "StartFragment");
wsprintf(ptr+14, "%08u", strstr(buf, "<!--StartFrag") - buf);
*(ptr+14+8) = '\r';
ptr = strstr(buf, "EndFragment");
wsprintf(ptr+12, "%08u", strstr(buf, "<!--EndFrag") - buf);
*(ptr+12+8) = '\r';
// Now you have everything in place ready to put on the clipboard.
// Open the clipboard...
if(OpenClipboard(0))
{
// Empty what's in there...
EmptyClipboard();
// Allocate global memory for transfer...
HGLOBAL hText = GlobalAlloc(GMEM_MOVEABLE |GMEM_DDESHARE, strlen(buf)+4);
// Put your string in the global memory...
char *ptr = (char *)GlobalLock(hText);
strcpy(ptr, buf);
GlobalUnlock(hText);
::SetClipboardData(cfid, hText);
CloseClipboard();
// Free memory...
GlobalFree(hText);
}
// Clean up...
delete [] buf;
}
При использовании этой функции для копирования фрагмента HTML-кода в буфер обмена может выглядеть следующим образом:
char *html =
"<b>This is a test</b><hr>"
"<li>entry 1"
"<li>entry 2";
CopyHTML(html);
Дополнительная информация
Использование подхода, который отправляет HTML-код в буфер обмена, может быть особенно полезным для клиентов службы автоматизации Office. Например, если у вас есть клиент автоматизации, который должен создавать форматированные данные для ячеек в Excel или абзацах в Word, можно создать данные в HTML-коде, отправить его в буфер обмена, а затем вставить его в приложение. С помощью этого метода можно уменьшить количество исходящих вызовов клиента службы автоматизации.