經(jīng)常在論壇上見(jiàn)到一些使用者詢(xún)問(wèn)如何在Visual C++中如何實(shí)現(xiàn)對(duì)剪貼板的操作,其實(shí)在VC++/MFC中是相當(dāng)簡(jiǎn)單的。本文主要介紹了如下內(nèi)容: 1、文本內(nèi)容的操作 2、WMF數(shù)據(jù)的操作 3、位圖的操作 4、設(shè)置使用自定義格式 5、感知剪貼板內(nèi)容的改變 6、自動(dòng)將數(shù)據(jù)粘貼到另一應(yīng)用程序窗口
一、文本內(nèi)容的操作 下面的代碼示范了如何將文本內(nèi)容復(fù)制到剪貼板:
Cstring source; //文本內(nèi)容保存在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(); }
下面的代碼顯示了如何從剪貼板上獲得文本內(nèi)容:
char * buffer = NULL; //打開(kāi)剪貼板 CString fromClipboard; if ( OpenClipboard() ) { HANDLE hData = GetClipboardData(CF_TEXT); char * buffer = (char*)GlobalLock(hData); fromClipboard = buffer; GlobalUnlock(hData); CloseClipboard(); }
二、WMF數(shù)據(jù)的操作
在剪貼板上讀寫(xiě)圖象數(shù)據(jù)是非常有用的功能,并且實(shí)現(xiàn)起來(lái)也很簡(jiǎn)單。下面的代碼顯示了如何將擴(kuò)展圖元文件復(fù)制到剪貼板:
if(OpenClipboard()); { EmptyClipboard();
//創(chuàng)建圖元文件DC CMetaFileDC * cDC = new CMetaFileDC(); cDC->CreateEnhanced(GetDC(),NULL,NULL,"the_name");
//調(diào)用繪圖例程
//關(guān)閉CMetafileDC并獲得它的句柄 HENHMETAFILE handle = cDC->CloseEnhanced();
//復(fù)制到剪貼板 SetClipBoardData(CF_ENHMETAFILE,handle); CloseClipboard();
//刪除dc delete cDC; }
下面的代碼演示了從剪貼板獲得圖元文件并將其繪制到client DC上:
if(OpenClipboard()) { //獲得剪貼板數(shù)據(jù) HENMETAFILE handle = (HENMETAFILE)GetClipboardData(CF_ENHMETAFILE);
//顯示 CClientDC dc(this); CRect client(0,0,200,200); dc.PlayMetaFile(handle,client);
//關(guān)閉剪貼板 CloseClipboard(); } 三、位圖的操作
位圖的操作稍微復(fù)雜一點(diǎn),下面這個(gè)例子顯示了如何在剪貼板保存位圖:
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"));
//復(fù)制數(shù)據(jù)到剪貼板 SetClipboardData(CF_BITMAP,junk->m_hObject); CloseClipboard();
delete junk; }
下面的代碼顯示了如何從剪貼板上獲得位圖數(shù)據(jù):
if(OpenClipboard()) { //獲得剪貼板數(shù)據(jù) 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(); }
四、設(shè)置并使用自定義格式
使用RegisterClipboardFormat()函數(shù),可以復(fù)制和粘貼任何你需要的數(shù)據(jù)類(lèi)型。比如我們有以下一個(gè)數(shù)據(jù)類(lèi)型:
struct MyFormatData { long val1; int val2; };
我們要把它復(fù)制到剪貼板,可以使用如下的代碼:
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);
//保存到內(nèi)存 *buffer = data;
//保存到剪貼板 GlobalUnlock(clipbuffer); SetClipboardData(format,clipbuffer); CloseClipboard(); }
讀取數(shù)據(jù)使用以下代碼:
UINT format = RegisterClipboardFormat("MY_CUSTOM_FORMAT"); MyFormatData data; if(Openclipboard()) { HANDLE hData =GetClipboardData(format); MyFormatData * buffer = (MyFormatData*)GlobalLock(hData);
data = *buffer;
GlobalUnlock(hData); CloseClipboard(); }
五、感知剪貼板內(nèi)容的改變
通過(guò)Windows消息可以感知剪貼板內(nèi)容是否發(fā)生改變,代碼如下:
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(); }
六、自動(dòng)將數(shù)據(jù)粘貼到另一應(yīng)用程序窗口
只需獲得相應(yīng)窗口的句柄,并發(fā)送一個(gè)消息就可以了:
SendMessage(m_hTextWnd, WM_PASTE, 0, 0);
|