VC 剪贴板操作

VC++ 专栏收录该内容
28 篇文章 0 订阅

一、设置剪贴板文本

  1. /**************************************************************************** 
  2.   设置剪贴板文本 
  3. ****************************************************************************/  
  4. bool SetClipBoardText(const TCHAR* text,HWND hWnd)  
  5. {  
  6.  ASSERT(hWnd);  
  7.  //打开剪贴板  
  8.  if ( !::OpenClipboard(hWnd) )  
  9.   return false;  
  10.  //empties the clipboard and frees handles to data in the clipboard  
  11.  if ( !EmptyClipboard() )  
  12.  {  
  13.   CloseClipboard();  
  14.   return false;  
  15.  }  
  16.  //get text length  
  17.  int len=_tcslen(text);  
  18.  //After SetClipboardData is called, the system owns the object identified by the hMem parameter.   
  19.  //The application can read the data, but must not free the handle or leave it locked. If the   
  20.  //hMem parameter identifies a memory object, the object must have been allocated using the   
  21.  //GlobalAlloc function with the GMEM_MOVEABLE and GMEM_DDESHARE flags.   
  22.  HANDLE hClip=GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE,(len+1)*sizeof(TCHAR));  
  23.  if (hClip==NULL)  
  24.  {  
  25.   CloseClipboard();  
  26.   return false;  
  27.  }  
  28.  //locks a global memory object and returns a pointer to the first byte of the object's memory block  
  29.  TCHAR* pBuf=(TCHAR*)GlobalLock(hClip);  
  30.  if (pBuf==NULL)  
  31.  {  
  32.   GlobalFree(hClip);    
  33.   CloseClipboard();  
  34.   return false;  
  35.  }  
  36.    
  37.  memcpy(pBuf,text,len*sizeof(TCHAR));  
  38.  pBuf[len]=NULL;  
  39.    
  40.  GlobalUnlock(hClip);  
  41.  if (NULL==SetClipboardData(CF_TEXT,hClip))  
  42.  {  
  43.   GlobalFree(hClip);    
  44.   CloseClipboard();  
  45.   return false;  
  46.  }  
  47.    
  48.  CloseClipboard();  
  49.  return true;  
  50. }  
 

二、获取剪贴板文本

  1. #include <string>  
  2. using namespace std;  
  3.    
  4. /**************************************************************************** 
  5. 获取剪贴板文本 
  6. ****************************************************************************/  
  7. string GetClipBoardText(HWND hWnd)  
  8. {       
  9.  ASSERT(hWnd);  
  10.  string ClipBoardText;  
  11.   //判断剪贴板的数据格式是否可以处理。  
  12.     if (!IsClipboardFormatAvailable(CF_TEXT))   
  13.   return ClipBoardText;   
  14.    
  15.  //打开剪贴板。          
  16.  if (!::OpenClipboard(hWnd))  
  17.   return ClipBoardText;   
  18.    
  19.  //获取数据  
  20.  HGLOBAL hMem = GetClipboardData(CF_TEXT);   
  21.  if (hMem != NULL)           
  22.  {   
  23.   //获取字符串。  
  24.   LPTSTR lpStr = (LPTSTR)GlobalLock(hMem);   
  25.   if (lpStr != NULL)        
  26.   {   
  27.    ClipBoardText=lpStr;  
  28.     
  29.    //释放锁内存  
  30.    GlobalUnlock(hMem);       
  31.   }            
  32.  }    
  33.    
  34.  //关闭剪贴板        
  35.  CloseClipboard();    
  36.  return ClipBoardText;  
  37. }  
 

 

三、获得剪贴板位图:

  1. //获得剪贴板位图  
  2. HBITMAP bitmap=(HBITMAP)GetClipboardData(CF_BITMAP);  
 

四、复制位图到剪贴板

  1. 最简单的形式:  
  2. void BitmapToClipboard(HBITMAP hBitmap)  
  3. {  
  4.  ::OpenClipboard(NULL);  
  5.  ::EmptyClipboard() ;  
  6.  ::SetClipboardData(CF_BITMAP,hBitmap);  
  7.  ::CloseClipboard();  
  8. }  
  9. 复制位图到剪贴板    
  10.   复制一幅位图到剪贴板相当简单,需要记住的一个是如果位图需要调色盘,  
  11. 你应当将调色盘也复制。  
  12. 函数一:复制设备相关位图到剪贴板  
  13. CopyBitmapToClipboard()函数复制一幅DDB位图到剪贴板,如果提供调色盘它将  
  14. 同时复制调色盘。注意在最后调用Detach()。这一点很重要,因为此时GDI对象  
  15. 的物主已经传送至剪贴板。  
  16. // CopyBitmapToClipboard - Copies a device-dependent bitmap to clipboard  
  17. // pWnd    - Pointer to window that opens the clipboard  
  18. // bitmap   - The device-dependent bitmap  
  19. // pPal    - Pointer to logical palette - Can be NULL  
  20. // NOTE    - GDI objects are detached from bitmap & pPal  
  21. //      as the clipboard owns them after the copy  
  22. void CopyBitmapToClipboard( const CWnd *pWnd, CBitmap& bitmap, CPalette* pPal )  
  23. {  
  24.  ::OpenClipboard(pWnd->GetSafeHwnd());  
  25.  ::EmptyClipboard() ;  
  26.  if( pPal )  
  27.   ::SetClipboardData (CF_PALETTE, pPal->GetSafeHandle() ) ;  
  28.  ::SetClipboardData (CF_BITMAP, bitmap.GetSafeHandle() ) ;  
  29.  ::CloseClipboard () ;  
  30.  bitmap.Detach();  
  31.  if( pPal )  
  32.   pPal->Detach();  
  33. }  
  34. 函数二:复制设备无关位图到剪贴板  
  35.   CopyDIBToClipboard()函数和CopyBitmapToClipboard()非常相似。内存句柄包  
  36. 含了BITMAPINFO 和位图的位信息,通过GlobalAlloc()分配。  
  37. // CopyDIBToClipboard - Copies a device-dependent bitmap to clipboard  
  38. // pWnd   - Pointer to window that opens the clipboard  
  39. // hDIB   - Memory handle that contains BITMAPINFO & bitmap bits  
  40. // pPal   - Pointer to logical palette - Can be NULL  
  41. // NOTE   - GDI objects are detached from bitmap & pPal  
  42. //     as the clipboard owns them after the copy  
  43. void CopyDIBToClipboard( const CWnd *pWnd, HGLOBAL hDIB, CPalette* pPal )  
  44. {  
  45.  ::OpenClipboard(pWnd->GetSafeHwnd());  
  46.  ::EmptyClipboard();  
  47.  if( pPal )  
  48.   ::SetClipboardData (CF_PALETTE, pPal->GetSafeHandle() ) ;  
  49.  ::SetClipboardData (CF_DIB, hDIB ) ;  
  50.  ::CloseClipboard () ;  
  51.  bitmap.Detach();  
  52.  if( pPal )  
  53.   pPal->Detach();  
  54. }  
 


 

五、更多剪贴板的操作,请看下面:(以下资料来自网络,找不到出处了)

 

本文主要介绍了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.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
    收藏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值