Visual C++剪贴板操作不完全攻略
2015-06-07 11:11
453 查看
经常在论坛上见到一些使用者询问如何在Visual C++中如何实现对剪贴板的操作,其实在VC++/MFC中是相当简单的。本文主要介绍了如下内容:
1、文本内容的操作
2、WMF数据的操作
3、位图的操作
4、设置使用自定义格式
5、感知剪贴板内容的改变
6、自动将数据粘贴到另一应用程序窗口
一、文本内容的操作
下面的代码示范了如何将文本内容复制到剪贴板:
下面的代码显示了如何从剪贴板上获得文本内容:
二、WMF数据的操作
在剪贴板上读写图象数据是非常有用的功能,并且实现起来也很简单。下面的代码显示了如何将扩展图元文件复制到剪贴板:
下面的代码演示了从剪贴板获得图元文件并将其绘制到client DC上:
三、位图的操作
位图的操作稍微复杂一点,下面这个例子显示了如何在剪贴板保存位图:
四、设置并使用自定义格式
使用RegisterClipboardFormat()函数,可以复制和粘贴任何你需要的数据类型。比如我们有以下一个数据类型:
读取数据使用以下代码:
五、感知剪贴板内容的改变
通过Windows消息可以感知剪贴板内容是否发生改变,代码如下:
In your initialization code call:
六、自动将数据粘贴到另一应用程序窗口
只需获得相应窗口的句柄,并发送一个消息就可以了:
一个应用例子:
void CChatDlg::OnFace()
{
// TODO: Add your control notification handler code here
int index=m_BmpPicker.GetCurrentBitmapIndex();
if(OpenClipboard())
{
EmptyClipboard();
CBitmap * junk =m_BmpPicker.GetBitmapAt(index);
//复制数据到剪贴板
SetClipboardData(CF_BITMAP,junk->m_hObject);
CloseClipboard();
}
//MessageBox("已选择表情!请在需要插入表情处进行粘贴");
CWnd *pWnd = GetDlgItem(IDC_RICHTEXT_SEND); // 取得控件的指针
HWND hWnd = pWnd->GetSafeHwnd(); // 取得控件的句柄
::SendMessage(hWnd, WM_PASTE, 0, 0);
}
简单的说:
一、打开剪切板
OpenClipboard();
二、获得指向剪切板的全局指针变量
HANDLE hClipMemory=::GetClipboardData(CF_TEXT);
三、锁定剪切板
LPBYTE lpClipMemory = (LPBYTE)GlobalLock(hClipMemory);
四、获取剪切板内容
CString m_sMessage = CString(lpClipMemory);
五、解锁剪切板
GlobalUnlock(hClipMemory);
六、关闭剪切板
::CloseClipboard();
读取剪切板内容必须先锁定剪切板,否则会发生异常。以上只能读取文本格式的内容,无法读取位图,具体请查阅MSDN帮助文档。
经常在论坛上见到一些使用者询问如何在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(); }
下面的代码演示了从剪贴板获得图元文件并将其绘制到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);
一个应用例子:
void CChatDlg::OnFace()
{
// TODO: Add your control notification handler code here
int index=m_BmpPicker.GetCurrentBitmapIndex();
if(OpenClipboard())
{
EmptyClipboard();
CBitmap * junk =m_BmpPicker.GetBitmapAt(index);
//复制数据到剪贴板
SetClipboardData(CF_BITMAP,junk->m_hObject);
CloseClipboard();
}
//MessageBox("已选择表情!请在需要插入表情处进行粘贴");
CWnd *pWnd = GetDlgItem(IDC_RICHTEXT_SEND); // 取得控件的指针
HWND hWnd = pWnd->GetSafeHwnd(); // 取得控件的句柄
::SendMessage(hWnd, WM_PASTE, 0, 0);
}
简单的说:
一、打开剪切板
OpenClipboard();
二、获得指向剪切板的全局指针变量
HANDLE hClipMemory=::GetClipboardData(CF_TEXT);
三、锁定剪切板
LPBYTE lpClipMemory = (LPBYTE)GlobalLock(hClipMemory);
四、获取剪切板内容
CString m_sMessage = CString(lpClipMemory);
五、解锁剪切板
GlobalUnlock(hClipMemory);
六、关闭剪切板
::CloseClipboard();
读取剪切板内容必须先锁定剪切板,否则会发生异常。以上只能读取文本格式的内容,无法读取位图,具体请查阅MSDN帮助文档。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- C++中拷贝构造函数的应用详解
- C++中引用(&)的用法与应用实例分析
- C++使用CriticalSection实现线程同步实例
- Visual C++中MFC消息的分类
- C++智能指针实例详解