Visual C++剪贴板操作不完全攻略

编程入门 行业动态 更新时间:2024-10-04 17:32:17

Visual C++<a href=https://www.elefans.com/category/jswz/34/1770231.html style=剪贴板操作不完全攻略"/>

Visual C++剪贴板操作不完全攻略

 经常在论坛上见到一些使用者询问如何在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 handleWhich 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 hereint 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++剪贴板操作不完全攻略

本文发布于:2024-02-28 00:21:55,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1767112.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:剪贴板   不完   全攻略   操作   Visual

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!