設置 | 登錄 | 註冊

目前共有5篇帖子。

【示例代碼】C++在剪切板中放置多種數據格式的內容

1樓 巨大八爪鱼 2016-1-1 23:20
在本示例中,執行cut函數時,將文本「information」以文本格式CF_TEXT放置到剪切板中,將工程中的位圖資源IDB_BITMAP1以位圖格式CF_BITMAP放置到剪切板中,再定義一個Information的結構體,並創建一個變量,賦值,然後將其以自定義格式myformat放置到剪切板中。

執行cut函數後,可以打開記事本,粘貼,內容如下:

2樓 巨大八爪鱼 2016-1-1 23:21
然後打開畫圖,粘貼,結果如下:

3樓 巨大八爪鱼 2016-1-1 23:23
最後,為了讀取剪切板中Information結構體的內容,執行paste()函數:
結果如下:

這是剪切板中的文本格式CF_TEXT的內容。

這就是剪切板中的自定義格式——Information 結構體的內容。
4樓 巨大八爪鱼 2016-1-1 23:25
【代碼】
【編譯前,請將工程調整為使用多字節字符集】
#include <tchar.h>
#include <string>

struct Information
{
    int id;
    char name[50];
    char content[200];
    bool replied;
    int replies_num;
};

void cut(HWND hWnd)
{
    TCHAR str[] = TEXT("information");
    HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, sizeof(str));
    LPTSTR lptStr = (LPTSTR)GlobalLock(hMem);
    memcpy(lptStr, str, sizeof(str));
    GlobalUnlock(hMem);

    HBITMAP hBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));

    Information info;
    info.id = 49;
    _tcscpy_s(info.name, TEXT("Tony"));
    _tcscpy_s(info.content, TEXT("對於不同的程序,這些格式的規定是不同的,因此這些格式只針對某一具體程序的不同實例才有意義。"));
    info.replied = true;
    info.replies_num = 12306;

    HGLOBAL hMem2 = GlobalAlloc(GMEM_MOVEABLE, sizeof(info));
    Information *pInfo = (Information *)GlobalLock(hMem2);
    memcpy(pInfo, &info, sizeof(info));
    GlobalUnlock(hMem2);
    UINT myformat = RegisterClipboardFormat("Information Struct Format");

    OpenClipboard(hWnd);
    EmptyClipboard();
    SetClipboardData(CF_TEXT, hMem);
    SetClipboardData(CF_BITMAP, hBitmap);
    SetClipboardData(myformat, hMem2);
    CloseClipboard();
}

void paste(HWND hWnd)
{
    if (!IsClipboardFormatAvailable(CF_TEXT))
    {
        MessageBox(hWnd, TEXT("剪切板中沒有文本內容!"), TEXT("剪切板"), MB_ICONWARNING);
        return;
    }
    OpenClipboard(hWnd);
    HGLOBAL hMem = GetClipboardData(CF_TEXT);
    if (hMem)
    {
        LPTSTR str = (LPTSTR)GlobalLock(hMem);
        if (str)
        {
            MessageBox(hWnd, str, TEXT("剪切板內容"), MB_ICONWARNING);
            GlobalUnlock(hMem);
        }
    }

    UINT myformat = RegisterClipboardFormat("Information Struct Format"); // 只要格式名稱相同,返回的UINT值也相同
    if (IsClipboardFormatAvailable(myformat))
    {
        hMem = GetClipboardData(myformat);
        if (hMem)
        {
            Information *info = (Information *)GlobalLock(hMem);
            if (info)
            {
                TCHAR tstr[500];
                _stprintf_s(tstr, TEXT("編號: %d\r\n名稱: %s\r\n內容: %s"), info->id, info->name, info->content);
                if (info->replied)
                {
                    TCHAR subtstr[30];
                    _stprintf_s(subtstr, TEXT("\r\n已回復,回複數: %d"), info->replies_num);
                    _tcscat_s(tstr, subtstr);
                }
                MessageBox(hWnd, tstr, TEXT("自定義剪切板格式的內容"), MB_ICONWARNING);
                GlobalUnlock(hMem);
            }
        }
    }

    CloseClipboard();
}
5樓 巨大八爪鱼 2016-1-1 23:27
把結構體變量放進剪切板後,在自己的程序中傳遞數據十分方便。
不過要注意結構體變量中最好不要包含指針成員變量。

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。