程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> 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();

      }

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

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

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved