Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se muestra cómo agregar código de Lenguaje de marcado de hipertexto (HTML) al Portapapeles de Microsoft Windows mediante Visual C++.
Versión original del producto: Visual C++
Número de KB original: 274308
Resumen
En este artículo se incluye una función de ejemplo que puede usar en las aplicaciones para simplificar el proceso de agregar código HTML al Portapapeles.
Formato del Portapapeles HTML
HTML tiene su propio formato de portapapeles denominado Formato HTML (CF_HTML) que puede usar para proporcionar los datos a otras aplicaciones, como Excel, Word u otras aplicaciones de Office.
CF_HTML es completamente un formato basado en texto que incluye una descripción, un contexto y un fragmento dentro de ese contexto. Al compilar datos para enviarlos al Portapapeles, debe incluir una descripción de los datos para indicar la versión del Portapapeles y los desplazamientos para el contexto y el fragmento. Calcular los desplazamientos puede ser la parte difícil. Sin embargo, puede usar la siguiente rutina para simplificar esta tarea.
Para obtener más información, vea Formato html del Portapapeles.
Código de ejemplo
// 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;
}
Cuando se usa esta función para copiar un fragmento de código HTML en el Portapapeles, podría ser similar al ejemplo siguiente:
char *html =
"<b>This is a test</b><hr>"
"<li>entry 1"
"<li>entry 2";
CopyHTML(html);
Más información
El uso de un enfoque que envía código HTML al Portapapeles puede ser especialmente beneficioso para los clientes de automatización de Office. Por ejemplo, si tiene un cliente de automatización que necesita generar datos con formato para celdas en Excel o párrafos en Word, puede compilar los datos en código HTML, enviarlos al Portapapeles y, a continuación, pegarlos en la aplicación. Con esta técnica, podría reducir el número de llamadas fuera de proceso al cliente de Automation.