C++操作剪贴板

分类:

文章摘要: 
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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值