剪贴板实际上是系统维护管理的一块内存区域,当在一个进程中复制数据时,是将这个数据放到该块内存区域中,当在另一个进程中粘贴数据时,是从该块内存区域中取出数据。
剪贴板的VC实现很简单,下面是剪贴板实现过程以及我学习过程中的一些理解:
1.首先建立一个基于对话框的应用程序,并添加2个edit box和2个button,在这里,ID号分别为:IDC_EDIT_SEND,IDC_EDIT_RECV,IDC_BTN_SEND,IDC_BTN_RECV。并为button控件添加2个消息相应函数,分别为:OnBtnSend(),OnBtnRecv()。
2.OnBtnSend()函数下面添加相应代码,在这里实现文本通信:
(1)打开剪贴板,函数为OpenClipboard() 如果成功,返回非零值,否则,零值;
(2)如果打开成功,则获取剪贴板的使用权。调用函数EmptyClipboard();
(3)获取要传输的文本信息,GetDlgItemText(IDC_EDIT_SEND,CString);
(4)在前面第一句话就介绍了,剪贴板实际上是一块内存区域,所以接下来,我们要申请一块内存,调用GlobalAlloc(UINT,SIZE_T)分配内存。其中有2个参数,前面一个是标记,后面一个是分配字节数。这个函数如果成功则返回一个句柄。
(5)申请好了内存区域,我们要将文本字符串放入内存中。而前面申请内存时,返回的是一个句柄,所以要将句柄转为指针,在这里用GlobalLock(hMem);这个函数的参数是一个全局内存对象,返回该对象内存块第一个字节的指针。获得内存指针后,调用strcpy(char*,const char*)将文本字符串复制到内存中。最后不要忘记调用解锁函数GlobalUnLock(hMem);
(6)将文本信息放置到剪贴板上SetClipboardData(CF_TEXT,hMem);
(7)关闭剪贴板CloseClipboard(hMem);
具体代码如下:
//
if (OpenClipboard())
{
EmptyClipboard();
CString str;
HANDLE hClip;
char* pBuf;
GetDlgItemText(IDC_EDIT_SEND,str);
hClip = (char*)GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1);
pBuf = (char*)GlobalLock(hClip);
strcpy(pBuf,str);
GlobalUnlock(hClip);
SetClipboardData(CF_TEXT,hClip);
CloseClipboard();
}
//
3.OnBtnRecv()函数接收剪贴板中信息:
(1)打开剪贴板OpenClipboard()
(2)在这里进行一个判断,看剪贴板上是否有我们要的信息。函数IsClipboardFormatAvailable(CF_TEXT)
(3)读取剪贴板上,我们需要的信息。函数GetClipboardData(CF_TEXT);返回值是一个以指定格式存在的剪贴板对象的句柄;
(4)然后将句柄转为地址,调用GlobalLock()和GlobalUnLock(),获取内存地址;
(5)将数据放到IDC_EDIT_RECV中,SetDlgItemText();
(6)不要忘记关闭剪贴板。
具体代码如下:
///
if (OpenClipboard())
{
if(IsClipboardFormatAvailable(CF_TEXT))
{
char* pBuf;
HANDLE hClip;
hClip = GetClipboardData(CF_TEXT);
pBuf = (char*)GlobalLock(hClip);
GlobalUnlock(hClip);
SetDlgItemText(IDC_EDIT_RECV,pBuf);
}
CloseClipboard();
}
///