用代码操纵剪切板

拷贝与粘贴文本

下边的源代码演示了如何将文本(包含在CString对象“source”中)拷贝到剪贴板上。


CString source;
//put your text insource
if(OpenClipboard())
{
HGLOBALclipbuffer;
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;
//open the clipboard
CString fromClipboard;
if ( OpenClipboard())
{
HANDLEhData = GetClipboardData(CF_TEXT );
char* buffer = (char*)GlobalLock(hData );
fromClipboard= buffer;
GlobalUnlock(hData );
CloseClipboard();
}




拷贝与粘贴WMF(enhanced)数据

你想在你的程序中往剪贴板上以及向剪贴板读取图形吗?请放心,这个――不难!示范代码如下,其实现的是往剪贴板上写一enhancedmetafile


if ( OpenClipboard())
{
EmptyClipboard();

//createthe metafile DC
CMetaFileDC* cDC = newCMetaFileDC();
cDC->CreateEnhanced(GetDC(),NULL,NULL,"the_name");

//calldraw routine here thatmakes GDI calls intcDC

//closemeta CMetafileDC and getits handle
HENHMETAFILEhandle = cDC->CloseEnhanced();

//placeit on the clipboard
SetClipboardData(CF_ENHMETAFILE,handle);
CloseClipboard();

//deletethe dc
deletecDC;
}



好啦,该演示反过来怎么做的代码了。我们从剪贴板上取得metafile并将其画到自己的应用程序的客户区DC(设备上下文)上(仅仅是个试验而已,实际上你可能更想将它拷贝一份儿)。

if( OpenClipboard() )
{
//Getthe clipboard data
HENHMETAFILEhandle =(HENHMETAFILE)GetClipboardData(CF_ENHMETAFILE);

//playit into a DC (ourown DC in thisexample)
CClientDCdc(this);
CRectclient(0,0,200,200);
dc.PlayMetaFile(handle,client);

//closethe clipboard
CloseClipboard();
}



拷贝与粘贴一张位图(BitMap

拷贝和粘贴位图可是需要一些微妙的处理的,不过基本的思想还是一样。请看下面的代码。

if( OpenClipboard() )
{
EmptyClipboard();
//createsome data
CBitmap* junk = newCBitmap();
CClientDCcdc(this);
CDCdc;
dc.CreateCompatibleDC(&cdc);
CRectclient(0,0,200,200);
junk->CreateCompatibleBitmap(&cdc,client.Width(),client.Height());
dc.SelectObject(junk);

//calldraw routine here thatmakes GDI calls
DrawImage(&dc,CString("Bitmap"));

//putthe data on theclipboard
SetClipboardData(CF_BITMAP,junk->m_hObject);
CloseClipboard();

//copyhas been made onclipboard so we candelete
deletejunk;
}



如下示例代码是从剪贴板上取得一张位图,将它粘贴到客户区DC中。

if( OpenClipboard() )
{
//Getthe clipboard data
HBITMAPhandle =(HBITMAP)GetClipboardData(CF_BITMAP);
CBitmap* bm =CBitmap::FromHandle(handle);

CClientDCcdc(this);
CDCdc;
dc.CreateCompatibleDC(&cdc);
dc.SelectObject(bm);
cdc.BitBlt(0,0,200,200,&dc,0,0,SRCCOPY);

CloseClipboard();
}



建立并使用你自己定做的数据格式

如果你要拷贝、粘贴其它格式的数据,可以用RegisterClipboardFormat()API函数先将此格式注册,然后就可以为所欲为了。这简直是太有用了,尤其是在我们自己的应用程序中拷贝资料。假设我们有下面的结构:

structMyFormatData
{
longval1;
intval2;
};



想将此结构的数据拷贝到剪贴板上。可以这样实现:

UINTformat =RegisterClipboardFormat("MY_CUSTOM_FORMAT");
if(OpenClipboard())
{
//makesome dummy data
MyFormatDatadata;
data.val1= 100;
data.val2= 200;

//allocatesome global memory
HGLOBALclipbuffer;
EmptyClipboard();
clipbuffer= GlobalAlloc(GMEM_DDESHARE,sizeof(MyFormatData));
MyFormatData* buffer =(MyFormatData*)GlobalLock(clipbuffer);

//putthe data into thatmemory
*buffer= data;

//Putit on the clipboard
GlobalUnlock(clipbuffer);
SetClipboardData(format,clipbuffer);
CloseClipboard();
}



想把它从剪贴板上读下来的话,也容易:

//
第二次调用时,此格式已经注册过了,读下来就行了

UINTformat =RegisterClipboardFormat("MY_CUSTOM_FORMAT");
MyFormatData data;
if ( OpenClipboard())
{
//getthe buffer
HANDLEhData = GetClipboardData(format);
MyFormatData* buffer = (MyFormatData*)GlobalLock( hData );

//
留一份儿当地拷贝
data= *buffer;

GlobalUnlock(hData );
CloseClipboard();
}



--------------------------------------------------------------------------------


取得剪贴板变化通知(Gettingnotified of clipboard changes

一旦剪贴板上的内容发生改变,我们都希望能够获知(经由windows消息),这是很有用的。你可以用函数SetClipboardViewer()来捕获WM_DRAWCLIPBOARD消息。

在你的初始化代码中调用:

SetClipboardViewer();//add us to clipboardchange notification chain



在你的消息映射(message map)中添加:

ON_MESSAGE(WM_DRAWCLIPBOARD,OnClipChange) //clipboardchange notification



将其定义为:

afx_msgvoid OnClipChange();//clipboard change notification



实现为:

voidCDetectClipboardChangeDlg::OnClipChange()
{
//dosomething here, for example
CTimetime = CTime::GetCurrentTime();
SetDlgItemText(IDC_CHANGED_DATE,time.Format("%a,%b %d, %Y --%H:%M:%S"));

DisplayClipboardText();
}



--------------------------------------------------------------------------------


将数据粘贴到其它应用程序窗口中的方法

我觉得如果能把文本拷贝到剪贴板上(参见上面的代码),然后再在另外一个应用程序中将这些文本粘贴过来,那样才有用。我写了一个很不错的本地应用程序,此程序使用了含有此技术的第三方的语言翻译包。很简单,仅是取得目标窗口的句柄,并向它发送“PASTE”消息就OK了。

SendMessage(m_hTextWnd,WM_PASTE, 0, 0);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值