剪贴板操作

Visual   C++剪贴板操作不完全攻略  作者:leasun  发布时间:2001/08/28    
  文章摘要:    
    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);  
  lstrcpy(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);   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值