MFC:使用剪貼簿,怎麼將內容複製到剪貼簿
阿新 • • 發佈:2018-12-27
經常在論壇上見到一些使用者詢問如何在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(); }
三、點陣圖的操作
點陣圖的操作稍微複雜一點,下面這個例子顯示瞭如何在剪貼簿儲存點陣圖:
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 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(); }
六、自動將資料貼上到另一應用程式視窗
只需獲得相應視窗的控制代碼,併發送一個訊息就可以了:
SendMessage(m_hTextWnd, WM_PASTE, 0, 0);