 |
在本示例中,执行cut函数时,将文本“information”以文本格式CF_TEXT放置到剪切板中,将工程中的位图资源IDB_BITMAP1以位图格式CF_BITMAP放置到剪切板中,再定义一个Information的结构体,并创建一个变量,赋值,然后将其以自定义格式myformat放置到剪切板中。 执行cut函数后,可以打开记事本,粘贴,内容如下: 
|
 |
然后打开画图,粘贴,结果如下: 
|
 |
最后,为了读取剪切板中Information结构体的内容,执行paste()函数: 结果如下:  这是剪切板中的文本格式CF_TEXT的内容。  这就是剪切板中的自定义格式——Information 结构体的内容。
|
 |
【代码】 【编译前,请将工程调整为使用多字节字符集】 #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(); }
|
 |
把结构体变量放进剪切板后,在自己的程序中传递数据十分方便。 不过要注意结构体变量中最好不要包含指针成员变量。
|