萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 編程語言綜合 >> vc++ mfc 剪貼板操作教程

vc++ mfc 剪貼板操作教程

  本文主要介紹了VC++/MFC中如下內容的剪貼板操作:

  1、文本內容的操作

  2、WMF數據的操作

  3、位圖的操作

  4、設置使用自定義格式

  5、感知剪貼板內容的改變

  6、自動將數據粘貼到另一應用程序窗口

  一、文本內容的操作

  下面的代碼示范了如何將文本內容復制到剪貼板(Unicode編碼的先轉化為ASCII):

  CString source;

  //文本內容保存在source變量中

  if( 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();

  }

  下面的代碼顯示了如何從剪貼板上獲得文本內容:

  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.SelectObje

  ct(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();

  }

  六、自動將數據粘貼到另一應用程序窗口

  只需獲得相應窗口的句柄,並發送一個消息就可以了

copyright © 萬盛學電腦網 all rights reserved