在richeditview中保存文件时用“static DWORD CALLBACK CBStreamOut”函数对于大于1M的文件耗时太长,原因在于这个函数每次都只能写很少内容,要多次调用造成的,我想利用剪贴板一次读取全部内容来解决时间问题,以下是网上的剪贴板操作方法。

1、文本内容的操作

2、WMF数据的操作

3、位图的操作

4、设置使用自定义格式

5、感知剪贴板内容的改变

6、自动将数据粘贴到另一应用程序窗口

一、文本内容的操作

下面的代码示范了如何将文本内容复制到剪贴板: Cstring source;
//文本内容保存在source变量中
if(openClipboard())
{
HGLOBAL clipbuffer;
char * buffer;
EmptyClipboard();
clipbuffer = GlobalAlloc(GMEM_DDESHARE, dource.GetLength()+1);
buffer = (char*)GlobalLock(clipbuffer);
Strcpy(buffer, LPCSTR(source));
GlobalUnlock(clipbuffer);
SetClipboardData(CF_TEXT,clipbuffer);
CloseClipboard();
}

下面的代码显示了如何从剪贴板上获得文本内容: char * buffer = NULL;
//打开剪贴板
CString fromClipboard;
if ( OpenClipboard() )
{
HANDLE hData = GetClipboardData(CF_TEXT);
char * buffer = (char*)GlobalLock(hData);
fromClipboard = buffer;
GlobalUnlock(hData);
CloseClipboard();
}

二、WMF数据的操作

在剪贴板上读写图象数据是非常有用的功能,并且实现起来也很简单。下面的代码显示了如何将扩展图元文件复制到剪贴板:
 if(OpenClipboard());
{
EmptyClipboard();
//创建图元文件DC
CMetaFileDC * cDC = new CMetaFileDC();
cDC->CreateEnhanced(GetDC(),NULL,NULL,"the_name");
//调用绘图例程
//关闭CMetafileDC并获得它的句柄
HENHMETAFILE handle = cDC->CloseEnhanced();
//复制到剪贴板
SetClipBoardData(CF_ENHMETAFILE,handle);
CloseClipboard();
//删除dc
delete cDC;
}

下面的代码演示了从剪贴板获得图元文件并将其绘制到client DC上: if(OpenClipboard())
{
//获得剪贴板数据
HENMETAFILE handle = (HENMETAFILE)GetClipboardData(CF_ENHMETAFILE);
//显示
CClientDC dc(this);
CRect client(0,0,200,200);
dc.PlayMetaFile(handle,client);
//关闭剪贴板
CloseClipboard();
}

三、位图的操作

位图的操作稍微复杂一点,下面这个例子显示了如何在剪贴板保存位图: if(OpenClipboard())
{
EmptyClipboard();
CBitmap * junk = new CBitmap();
CClientDC cdc(this);
CDC dc;
dc.CreateCompatibleDC(&cdc);
CRect client(0,0,200,200);
junk->CreateCompatibleBitmap(&cdc,client.Width(),client.Height());
dc.SelectObject(junk);
DrawImage(&dc,CString("Bitmap"));
//复制数据到剪贴板
SetClipboardData(CF_BITMAP,junk->m_hObject);
CloseClipboard();
delete junk;
}

下面的代码显示了如何从剪贴板上获得位图数据: if(OpenClipboard())
{
//获得剪贴板数据
HBITMAP handle = (HBITMAP)GetClipboardData(CF_BITMAP);
CBitmap * bm = CBitmap::FromHandle(handle);
CClientDC cdc(this);
CDC dc;
dc.CreateCompatibleDC(&cdc);
dc.SelectObject(bm);
cdc.BitBlt(0,0,200,200,&dc,0,0,SRCCOPY);
CloseClipboard();
}

四、设置并使用自定义格式

使用RegisterClipboardFormat()函数,可以复制和粘贴任何你需要的数据类型。比如我们有以下一个数据类型: struct MyFormatData
{
long val1;
int val2;
};

我们要把它复制到剪贴板,可以使用如下的代码: UINT format = RegisterClipBoardFormat("MY_CUSTOM_FORMAT");
if(OpenClipboard())
{
MyFormatData data;
data.val1 = 100;
data.val2 = 200;
HGLOBAL clipbuffer;
EmptyClipboard();
clipbuffer = GlobalAlloc(GMEM_DDESHARE, sizeof(MyFormatData));
MyFormatData * buffer = (MyFormatData*)GlobalLock(clipbuffer);
//保存到内存
*buffer = data;
//保存到剪贴板
GlobalUnlock(clipbuffer);
SetClipboardData(format,clipbuffer);
CloseClipboard();
}

读取数据使用以下代码:
 UINT format = RegisterClipboardFormat("MY_CUSTOM_FORMAT");
MyFormatData data;
if(Openclipboard())
{
HANDLE hData =GetClipboardData(format);
MyFormatData * buffer = (MyFormatData*)GlobalLock(hData);
data = *buffer;
GlobalUnlock(hData);
CloseClipboard();
}

五、感知剪贴板内容的改变

通过Windows消息可以感知剪贴板内容是否发生改变,代码如下: In your initialization code call:
SetClipboardViewer(); //将我们的程序添加到剪贴板观察链
In your message map add:
ON_MESSAGE(WM_DRAWCLIPBOARD, OnClipChange) //添加Message handle
Which is declared as:
afx_msg void OnClipChange();
Finally implement:
void CDetectClipboardChangeDlg::OnClipChange()
{
CTime time = CTime::GetCurrentTime();
SetDlgItemText(IDC_CHANGED_DATE,time.Format("%a, %b %d, %Y -- %H:%M:%S"));
DisplayClipboardText();
}

六、自动将数据粘贴到另一应用程序窗口

只需获得相应窗口的句柄,并发送一个消息就可以了:

SendMessage(m_hTextWnd, WM_PASTE, 0, 0);

希望用这种方法可以解决。

VC++下Window剪贴板的操作相关推荐

  1. vc下读写硬盘的操作

    <span style="font-size:18px;color:#cc0000;"> </span><p><span style=&q ...

  2. vc++实现avi文件的操作 用于视频解析及录制(转)

    vc++实现avi文件的操作 为了对avi进行读写,微软提供了一套API,总共50个函数,他们的用途主要有两类,一个是avi文件的操作,一类是数据流streams的操作. 1.打开和关闭文件 AVIF ...

  3. VC++下命名管道编程的原理及实现

    概述 管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机.命名管道(Named Pipes)是在管道服务器和一台或多台管道客户机之间进行 ...

  4. VC下调用x264进行视频编码,

    4.X264.c中,h = x264_encoder_open( param ) )是用来复制参数并验证参数的有效性,在CCS下应该是不需要验证参数的(参数都是在程序中设置好的),因此此处只作复制参数 ...

  5. VC下加载多种格式图片的方法总结

    From: http://www.cnblogs.com/Daywei/archive/2011/03/19/1988848.html 尽管VC有提供相应的API和类来操作bmp位图.图标和(增强)元 ...

  6. VC下发布的Release版程序的异常捕捉

    VC下发布的Release版程序的异常捕捉寻找Release版程发生异常退出的地方比Debug版麻烦得多.发生异常的时候windows通常会弹出一个错误对话框,点击详细信息,我们能获得出错的地址和大概 ...

  7. VC下Debug 和Release 区别【转】

    在工具栏上点右键,选择编译,将编译win32debug改为win32 Release即可.如果需要调试的话,还需要再改回来方可. 最近写代码过程中,发现 Debug 下运行正常,Release 下就会 ...

  8. VC 下加载 JPG / JPEG / GIF / PNG 图片最简单的方法

    VC MFC 提供的 API LoadBitmap / LoadImage 类 CBitmap 等都只能操作 BMP 位图,图标.对于其他常用的 JPG / JPEG / GIF / PNG 格式,它 ...

  9. VC++编程中的文件操作API和CFile类

    VC++编程中的文件操作API和CFile类 在VC编程中,操作文件的方法主要有两种:利用API函数和MFC的CFile类.微软在其中封装了文件的一般操作,下面我就介绍一下如何利用这两种方法实现文件操 ...

最新文章

  1. 光纤通信及周边产品知识汇总
  2. Flutter开发之Debug调试(十)
  3. html tab选项卡 控件,tab选项卡插件
  4. 10天学安卓-第七天
  5. ROS入门-12.服务端Server的编程实现
  6. Ubuntu下安装NetBeans步骤和相关问题的解决方法
  7. C#利用NPOI导出Excel
  8. 【毕业设计】python opencv 深度学习 指纹识别算法实现
  9. Pycharm工具下的数据可视化(图形绘制)
  10. 固态硬盘是什么接口_电脑固态硬盘和机械硬盘有什么区别-电脑固态硬盘和机械硬盘区别介绍...
  11. ps 批处理图片大小和压缩
  12. i.MX 8M Mini sai_low_power_audio
  13. java illegal key size,Java 解密错误InvalidKeyException: Illegal key size解决方法
  14. ISO/IEC 5055:软件代码质量的标尺
  15. 微信小程序 - BILIBILI-demo
  16. Springboot科学养宠 omap1计算机毕业设计-课程设计-期末作业-毕设程序代做
  17. 剖析非同质化代币ERC721-全面解析ERC721标准
  18. 【记录十七】Sling JCR Resources
  19. 在百度搜索结果中屏蔽CSDN
  20. 【U8+】用友U8+12.0在win11系统上IE Web Control 组件无法安装

热门文章

  1. springboot 开发入门,及问题汇总
  2. 解读Cardinality Estimation算法(第二部分:Linear Counting)
  3. 数据结构与算法—栈详解
  4. 网络爬虫:分离生产者和消费者来优化爬虫程序
  5. Redis入门(一)
  6. python中dataframe导出文件_使用Python将Pandas DataFrame导出为PDF文件
  7. android 8.0手机无法更新版本,安卓手机升级安卓8.0后 系统以后可能都无法回退
  8. 简要叙述计算机软件系统的组成,【计组第一章+答案】概论
  9. Redis宕机了怎么办?
  10. 【教程】瘦AP升级为胖AP的终极大法