VC编程:vc++ mfc 剪贴板操作教程
安安 2017-11-22 来源 :网络 阅读 1325 评论 0

摘要:本文将为大家讲解关于VC编程技术,通过VC编程的内容让你对相关知识点有进一步的认识和理解!

    本文将为大家讲解关于VC编程技术,通过VC编程的内容让你对相关知识点有进一步的认识和理解!

 

    本文主要介绍了VC++/MFC中如下内容的剪贴板操作:

  1、文本内容的操作

  2、WMF数据的操作

  3、位图的操作

  4、设置使用自定义格式

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

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

  一、文本内容的操作

  下面的代码示范了如何将文本内容复制到剪贴板(Unicode编码的先转化为ASCII):

  CString source;

  //文本内容保存在source变量中

  if( OpenClipboard() )

  {

  HGLOBAL clipbuffer;

  char * buffer;

  EmptyClipboard();

  clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.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.SelectObje

ct(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();

  }

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

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


    希望这篇VC编程文章可以帮助到你。总之,同学们,你想要的职坐标VC频道都能找到!

本文由 @安安 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved