目前共有5篇帖子。 內容轉換:不轉換▼
 
點擊 回復
369 4
【示例代码】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
把结构体变量放进剪切板后,在自己的程序中传递数据十分方便。
不过要注意结构体变量中最好不要包含指针成员变量。

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:369 回複數:4
評論數: ?
作者: 巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2016-1-1 23:27
 
©2010-2024 Arslanbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。