Ajouter du code HTML au Presse-papiers à l’aide de Visual C++

Cet article explique comment ajouter du code HTML (Hypertext Markup Language) au Presse-papiers Microsoft Windows à l’aide de Visual C++.

Version d’origine du produit : Visual C++
Numéro de la base de connaissances d’origine : 274308

Résumé

Cet article inclut un exemple de fonction que vous pouvez utiliser dans vos applications pour simplifier le processus d’ajout de code HTML au Presse-papiers.

Format du Presse-papiers HTML

HTML a son propre format de Presse-papiers appelé format HTML (CF_HTML) que vous pouvez utiliser pour fournir vos données à d’autres applications, telles qu’Excel, Word ou d’autres applications Office.

CF_HTML est entièrement un format texte qui inclut une description, un contexte et un fragment dans ce contexte. Lorsque vous générez des données à envoyer au Presse-papiers, vous devez inclure une description des données pour indiquer la version du Presse-papiers et les décalages pour le contexte et le fragment. Le calcul des décalages peut être la partie difficile. Toutefois, vous pouvez utiliser la routine suivante pour simplifier cette tâche.

Pour plus d’informations, consultez Format du Presse-papiers HTML.

Exemple de code

// 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;
}

Lorsque vous utilisez cette fonction pour copier un fragment de code HTML dans le Presse-papiers, elle peut ressembler à l’exemple suivant :

char *html =
    "<b>This is a test</b><hr>"
    "<li>entry 1"
    "<li>entry 2";
CopyHTML(html);

Plus d’informations

L’utilisation d’une approche qui envoie du code HTML au Presse-papiers peut être particulièrement utile pour les clients Office Automation. Par exemple, si vous avez un client Automation qui doit générer des données mises en forme pour des cellules dans Excel ou des paragraphes dans Word, vous pouvez générer les données en code HTML, les envoyer dans le Presse-papiers, puis les coller dans l’application. En utilisant cette technique, vous pouvez réduire le nombre d’appels hors processus au client Automation.