炼血堂林峰手里的法宝:Visual C++剪贴板操作不完全攻略

来源:百度文库 编辑:中财网 时间:2024/05/07 04:16:17
  经常在论坛上见到一些使用者询问如何在Visual C++中如何实现对剪贴板的操作,其实在VC++/MFC中是相当简单的。本文主要介绍了如下内容:
  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);(王朝网络 wangchao.net.cn)