第12章 剪贴板

剪切板的意义:把数据从程序自身传入和传出。

一、使用剪切板几项原则

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、



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值