 |
在本示例中,執行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(); }
|
 |
把結構體變量放進剪切板後,在自己的程序中傳遞數據十分方便。 不過要注意結構體變量中最好不要包含指針成員變量。
|