Hinzufügen von HTML-Code zur Zwischenablage mit Visual C++

In diesem Artikel wird das Hinzufügen von Html-Code (Hypertext Markup Language) zu Microsoft Windows Zwischenablage mit Visual C++ veranschaulicht.

Originalversion des Produkts:   Visual C++
Ursprüngliche KB-Nummer:   274308

Zusammenfassung

Dieser Artikel enthält eine Beispielfunktion, die Sie in Ihren Anwendungen verwenden können, um das Hinzufügen von HTML-Code zur Zwischenablage zu vereinfachen.

HTML-Zwischenablageformat

HTML verfügt über ein eigenes Zwischenablageformat namens HTML-Format (CF_HTML), das Sie verwenden können, um Ihre Daten für andere Anwendungen wie Excel, Word oder andere Office-Anwendungen bereitzustellen.

CF_HTML ist vollständig ein textbasiertes Format, das eine Beschreibung, einen Kontext und ein Fragment innerhalb dieses Kontexts enthält. Wenn Sie Daten erstellen, die an die Zwischenablage gesendet werden sollen, müssen Sie eine Beschreibung der Daten angeben, um die Zwischenablageversion und die Offsets für den Kontext und das Fragment anzugeben. Das Berechnen der Offsets kann der schwierige Teil sein. Sie können diese Aufgabe jedoch mithilfe der folgenden Routine vereinfachen.

Weitere Informationen finden Sie unter HTML-Zwischenablageformat.

Beispielcode

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

Wenn Sie diese Funktion verwenden, um ein HTML-Codefragment in die Zwischenablage zu kopieren, sieht es möglicherweise wie im folgenden Beispiel aus:

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

Weitere Informationen

Die Verwendung eines Ansatzes, der HTML-Code an die Zwischenablage sendet, kann für Office Automatisierungsclients besonders hilfreich sein. Wenn Sie beispielsweise über einen Automatisierungsclient verfügen, der formatierte Daten für Zellen in Excel oder Absätzen in Word generieren muss, können Sie die Daten in HTML-Code erstellen, an die Zwischenablage senden und dann in die Anwendung einfügen. Mithilfe dieser Technik können Sie die Anzahl der Out-of-Process-Aufrufe an den Automatisierungsclient verringern.