您的位置:首页 > 其它

第12章 剪贴板

2015-10-26 17:30 183 查看
剪切板的意义:把数据从程序自身传入和传出。

一、使用剪切板几项原则

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、
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: