<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      Visual C++剪貼板設置不完全攻略

      [摘要]經常在論壇上見到一些使用者詢問如何在Visual C++中如何實現對剪貼板的操作,其實在VC++/MFC中是相當簡單的。本文主要介紹了如下內容:1、文本內容的操作2、WMF數據的操作3、位圖的操作4...
          經常在論壇上見到一些使用者詢問如何在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);


      日韩精品一区二区三区高清