剪切板的意义:把数据从程序自身传入和传出。
一、使用剪切板几项原则
1、在处理单个消息的过程中使用OpenClipboard 和 CloseClipboard,避免不必要的长期打开剪切板
2、不要把一个锁定的内存句柄传递给剪切板
3、CF_TEXT|CF_UNICODETEXT调用SetClipBoardData之后,不要继续使用该内存
4、CF_BITMAP ,程序把位图传递给剪切板之后不应该继续使用该对象
二、文本粘贴使用
#ifdef UNICODE
#define CF_TCHAR CF_TEXT
#else
#define CF_TCHAR CF_UNICODETEXT
#endif
if(IsClipboardFormatAvailable(CF_TCHAR)) {
if(OpenClipboard(hDlg)) {
HANDLE hGlobla = GetClipboardData(CF_TCHAR);
if(hGlobla != NULL) {
PTSTR pGlobla = (PTSTR)GlobalLock(hGlobla);
SetDlgItemText(hDlg, IDC_EDIT_PASTE,pGlobla);
GlobalUnlock(hGlobla);
}
CloseClipboard();
}
}
三、延迟呈现
对于非常大的数据项,如果使用全局内存块,如果一直没有其他程序粘贴走,这样就造成了内存浪费,所以要采用延迟呈现的方法。
1、“复制”:SetClipboardData(CF_XXX,NULL);
2、另外一个程序调用GetClipboardData,Windows给你的窗口过程发送WM_READERFORMAT消息
case WM_RENDERFORMAT:
{
HGLOBAL hGlobal = ::GlobalAlloc(GMEM_SHARE|GMEM_FIXED|GHND,1024);
PTSTR pGlobal = (PTSTR)GlobalLock(hGlobal);
::lstrcpy(pGlobal,TEXT("我们哈哈haha"));
GlobalUnlock(hGlobal);
SetClipboardData(CF_TCHAR, hGlobal);
}
break;
不要打开剪切板,更不要清除剪切板
3、另外一个程序调用EmptyClipBoard,,Windows给你的窗口过程发送WM_DESTROYFORMAT,该消息指出不在需要用于建立剪切板数据的信息了
4、如果你的程序还是剪切板所有者,当你关闭窗口时,Windows给你的窗口过程发送WM_RENDERALLFORMAT,此时你打开剪切板,然后清除它,然后申请全局内存,然后对每种格式SetClipBoardData,接着Windows给你的窗口过程发送WM_DESTROYFORMAT,WM_DESTROY.
概念:
1、剪切板所有者:把数据放到剪切板里头的最后一个窗口。
四、私有数据类型
1、注册格式RegisterClipBoardFormat
2、其他操作步奏参考CF_TEXT即可
说明:
1、CF_TEXT和CF_UNICODETEXT可以互相转换,CF_BITMAP 和CF_DIB可以互相转换,CF_METAFILEPICT和CF_ENHMETAFILE可以互相转换
2、