下邊的源代碼演示了如何將文本(包含在CString對象“source”中)拷貝到剪貼板上。
CString source; //put your text in sourceif(OpenClipboard()){ HGLOBAL clipbuffer; 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();} 反過(guò)來(lái),下面的代碼是用來(lái)實(shí)現從剪貼板上取得文本的。
char * buffer = NULL;//open the clipboardCString fromClipboard;if ( OpenClipboard() ) { HANDLE hData = GetClipboardData( CF_TEXT ); char * buffer = (char*)GlobalLock( hData ); fromClipboard = buffer; GlobalUnlock( hData ); CloseClipboard();}你想在你的程序中往剪貼板上“畫(huà)”以及向剪貼板讀取圖形嗎?請放心,這個(gè)――不難!示范代碼如下,其實(shí)現的是往剪貼板上寫(xiě)一enhanced metafile。
if ( OpenClipboard() ){ EmptyClipboard(); //create the metafile DC CMetaFileDC * cDC = new CMetaFileDC(); cDC->CreateEnhanced(GetDC(),NULL,NULL,"the_name"); //call draw routine here that makes GDI calls int cDC //close meta CMetafileDC and get its handle HENHMETAFILE handle = cDC->CloseEnhanced(); //place it on the clipboard SetClipboardData(CF_ENHMETAFILE,handle); CloseClipboard(); //delete the dc delete cDC;}好啦,該演示反過(guò)來(lái)怎么做的代碼了。我們從剪貼板上取得metafile并將其畫(huà)到自己的應用程序的客戶(hù)區DC(設備上下文)上(僅僅是個(gè)試驗而已,實(shí)際上你可能更想將它拷貝一份兒)。
if ( OpenClipboard() ){ //Get the clipboard data HENHMETAFILE handle = (HENHMETAFILE)GetClipboardData(CF_ENHMETAFILE); //play it into a DC (our own DC in this example) CClientDC dc(this); CRect client(0,0,200,200); dc.PlayMetaFile(handle,client); //close the clipboard CloseClipboard();}拷貝和粘貼位圖可是需要一些微妙的處理的,不過(guò)基本的思想還是一樣。請看下面的代碼。
if ( OpenClipboard() ){ EmptyClipboard(); //create some data 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); //call draw routine here that makes GDI calls DrawImage(&dc,CString("Bitmap")); //put the data on the clipboard SetClipboardData(CF_BITMAP,junk->m_hObject); CloseClipboard(); //copy has been made on clipboard so we can delete delete junk;} 如下示例代碼是從剪貼板上取得一張位圖,將它粘貼到客戶(hù)區DC中。if ( OpenClipboard() ){ //Get the clipboard data 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() API函數先將此格式注冊,然后就可以“為所欲為”了。這簡(jiǎn)直是太有用了,尤其是在我們自己的應用程序中拷貝資料。假設我們有下面的結構:
struct MyFormatData{ long val1; int val2;};想將此結構的數據拷貝到剪貼板上??梢赃@樣實(shí)現:
UINT format = RegisterClipboardFormat("MY_CUSTOM_FORMAT");if(OpenClipboard()){ //make some dummy data MyFormatData data; data.val1 = 100; data.val2 = 200; //allocate some global memory HGLOBAL clipbuffer; EmptyClipboard(); clipbuffer = GlobalAlloc(GMEM_DDESHARE, sizeof(MyFormatData)); MyFormatData * buffer = (MyFormatData*)GlobalLock(clipbuffer); //put the data into that memory *buffer = data; //Put it on the clipboard GlobalUnlock(clipbuffer); SetClipboardData(format,clipbuffer); CloseClipboard();}想把它從剪貼板上讀下來(lái)的話(huà),也容易:
//第二次調用時(shí),此格式已經(jīng)注冊過(guò)了,讀下來(lái)就行了UINT format = RegisterClipboardFormat("MY_CUSTOM_FORMAT");MyFormatData data;if ( OpenClipboard() ) { //get the buffer HANDLE hData = GetClipboardData(format); MyFormatData * buffer = (MyFormatData *)GlobalLock( hData ); //留一份兒當地拷貝 data = *buffer; GlobalUnlock( hData ); CloseClipboard();}一旦剪貼板上的內容發(fā)生改變,我們都希望能夠獲知(經(jīng)由windows消息),這是很有用的。你可以用函數SetClipboardViewer()來(lái)捕獲WM_DRAWCLIPBOARD消息。
在你的初始化代碼中調用: SetClipboardViewer(); //add us to clipboard change notification chain 在你的消息映射(message map)中添加: ON_MESSAGE(WM_DRAWCLIPBOARD, OnClipChange) //clipboard change notification 將其定義為: afx_msg void OnClipChange(); //clipboard change notification 實(shí)現為:void CDetectClipboardChangeDlg::OnClipChange() { //do something here, for example CTime time = CTime::GetCurrentTime(); SetDlgItemText(IDC_CHANGED_DATE,time.Format("%a, %b %d, %Y -- %H:%M:%S")); DisplayClipboardText();}我覺(jué)得如果能把文本拷貝到剪貼板上(參見(jiàn)上面的代碼),然后再在另外一個(gè)應用程序中將這些文本粘貼過(guò)來(lái),那樣才有用。我寫(xiě)了一個(gè)很不錯的本地應用程序,此程序使用了含有此技術(shù)的第三方的語(yǔ)言翻譯包。很簡(jiǎn)單,僅是取得目標窗口的句柄,并向它發(fā)送“PASTE”消息就OK了。
SendMessage(m_hTextWnd, WM_PASTE, 0, 0);
聯(lián)系客服