VisualStudio2010 MFC中Clipboard剪贴板操作心得体会

在实现这个功能的过程中,我遇到了很多问题。
可能会存在以下四种情况:
1.代码不能使用
2.只能复制首字母
3.复制出来的乱码

基于以上出现的问题,大致是因为:
国内搜索到的关于剪切板的操作大多数是基于ASCII情况下的剪切板操作,包括MSDN上也是

关于两种差距对比:

//剪切板操作是win user api
#include <WinUser.h>

学习大致思路如下:
OpenClipboard //打开剪贴板
GlobalAlloc//分配内存保存要复制到剪贴板的数据
GlobalLock//内存加锁
内存操作:比如:strcpy,strncpy,memcpy_s,memset等
GlobalUnlock//内存解锁
SetClipboardData//将内存交给剪贴板管理,,复制内容到剪贴板
CloseClipboard//关闭剪贴板

ASCII

    CString source("hello");
    if(OpenClipboard())
    {
        HGLOBAL clipbuffer;
	    char* buffer;
		EmptyClipboard();
        clipbuffer = GlobalAlloc(GMEM_DDESHARE,source.GetLength()+1);
        buffer = (char*)GlobalLock(clipbuffer);
        strcpy(buffer,(LPSTR)(LPCTSTR)source);
        GlobalUnlock(clipbuffer);
        SetClipboardData(CF_TEXT,clipbuffer);
        CloseClipboard();
	}

Unicode

CString source("hello");
if(OpenClipboard())
{
 HGLOBAL clipbuffer;
 wchar_t* buffer;
 int buf_szie = source.GetLength();
 EmptyClipboard();
 clipbuffer = GlobalAlloc(GMEM_DDESHARE,(source.GetLength()+1)*sizeof(wchar_t));
 buffer = (wchar_t*)GlobalLock(clipbuffer);
 memset(buffer,0,(buf_szie+1)*sizeof(wchar_t));
 memcpy_s(buffer,buf_szie*sizeof(wchar_t),source.GetBuffer(0),buf_szie*sizeof(wchar_t));
 source.ReleaseBuffer();
 GlobalUnlock(clipbuffer);
 SetClipboardData(CF_UNICODETEXT,clipbuffer);
 CloseClipboard();
}

两者对比发现,其实相似的地方还是很多的,不同的地方就是:

//ASCII
char* buffer;
//Unicode
wchar_t* buffer;

//ASCII
GlobalAlloc(GMEM_DDESHARE,source.GetLength()+1);
//Unicode
GlobalAlloc(GMEM_DDESHARE,(source.GetLength()+1)*sizeof(wchar_t));

//ASCII
SetClipboardData(CF_TEXT,clipbuffer);
//Unicode
SetClipboardData(CF_UNICODETEXT,clipbuffer);


//在Unicode下我们还定义了int buf_szie = source.GetLength();  是为了让代码看起来简短
//很关键的复制方法是不同的,具体需要哪个来实现那就是能实现就行
//ASCII
 strcpy(buffer,(LPSTR)(LPCTSTR)source);
 //Unicode
 memset(buffer,0,(buf_szie+1)*sizeof(wchar_t));
 memcpy_s(buffer,buf_szie*sizeof(wchar_t),source.GetBuffer(0),buf_szie*sizeof(wchar_t));
 source.ReleaseBuffer();


//关于char 和wchar_t ,网上看到说关于Length的计算方法要调用不同函数
//ASCII
CString source;
source.GetLength();
//Unicode
Function(const wchar_t* data_str)
{
	int buf_szie = wcslen(data_str);
}
//实际测试,source.GetLength()不论是在ASCII和Unicode都可以使用,具体什么情况可能目前阶段我还不是太清楚,需要后期学习。

关于内存操作的链接:http://www.cplusplus.com/reference/cstring/memcpy/

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CDamogu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值