VC下复制位图到剪切板(Copy CBitBmp To ClipBoard)

作者:Wupei  |  发表时间:  |  所属分类:VC

简单的调用几个函数就可以了:

void CMyFun::CopyBmpToClipBoard(HBITMAP hBitmap)
{
	OpenClipboard();	//打开剪贴板 
	EmptyClipboard();	//清空剪切板 
	SetClipboardData(CF_BITMAP, hBitmap);	//将位图拷到剪贴板上
	CloseClipboard();	//关闭剪贴板
}

MSDN关于SetClipboardData的参数介绍,还可以使用很多功能:
第一个参数信息:
Standard Clipboard Formats

The clipboard formats defined by the system are called standard clipboard formats . These clipboard formats are described in the following table.

Value Meaning
CF_BITMAP A handle to a bitmap ( HBITMAP ).
CF_DIB A memory object containing a BITMAPINFO structure followed by the bitmap bits.
CF_DIBV5 Windows NT 5.0: A memory object containing a BITMAPV5HEADER structure followed by the bitmap color space information and the bitmap bits.
CF_DIF Software Arts’ Data Interchange Format.
CF_DSPBITMAP Bitmap display format associated with a private format. The hMem parameter must be a handle of data that can be displayed in bitmap format in lieu of the privately formatted data.
CF_DSPENHMETAFILE Enhanced metafile display format associated with a private format. The hMem parameter must be a handle of data that can be displayed in enhanced metafile format in lieu of the privately formatted data.
CF_DSPMETAFILEPICT Metafile-picture display format associated with a private format. The hMem parameter must be a handle of data that can be displayed in metafile-picture format in lieu of the privately formatted data.
CF_DSPTEXT Text display format associated with a private format. The hMem parameter must be a handle of data that can be displayed in text format in lieu of the privately formatted data.
CF_ENHMETAFILE A handle of an enhanced metafile ( HENHMETAFILE ).
CF_GDIOBJFIRST through CF_GDIOBJLAST Range of integer values for application-defined GDI object clipboard formats. Handles associated with clipboard formats in this range are not automatically deleted using the GlobalFree function when the clipboard is emptied. Also, when using values in this range, the hMem parameter is not a handle to a GDI object, but is a handle allocated by the GlobalAlloc function with the GMEM_DDESHARE and GMEM_MOVEABLE flags.
CF_HDROP A handle of type HDROP that identifies a list of files. An application can retrieve information about the files by passing the handle to the DragQueryFile functions.
CF_LOCALE The data is a handle to the locale identifier associated with text in the clipboard. When you close the clipboard, if it contains CF_TEXT data but no CF_LOCALE data, the system automatically sets the CF_LOCALE format to the current input locale. You can use the CF_LOCALE format to associate a different locale with the clipboard text.

An application that pastes text from the clipboard can retrieve this format to determine which character set was used to generate the text.

Note that the clipboard does not support plain text in multiple character sets. To achieve this, use a fomatted text data type such as RTF instead.

Windows NT: The system uses the code page associated with CF_LOCALE to implicitly convert from CF_TEXT to CF_UNICODETEXT. Therefore, the correct code page table is used for the conversion.

CF_METAFILEPICT Handle of a metafile picture format as defined by the METAFILEPICT structure. When passing a CF_METAFILEPICT handle by means of dynamic data exchange (DDE), the application responsible for deleting hMem should also free the metafile referred to by the CF_METAFILEPICT handle.
CF_OEMTEXT Text format containing characters in the OEM character set. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data.
CF_OWNERDISPLAY Owner-display format. The clipboard owner must display and update the clipboard viewer window, and receive the WM_ASKCBFORMATNAME , WM_HSCROLLCLIPBOARD , WM_PAINTCLIPBOARD , WM_SIZECLIPBOARD , and WM_VSCROLLCLIPBOARD messages. The hMem parameter must be NULL.
CF_PALETTE Handle of a color palette. Whenever an application places data in the clipboard that depends on or assumes a color palette, it should place the palette on the clipboard as well.
If the clipboard contains data in the CF_PALETTE (logical color palette) format, the application should use the SelectPalette and RealizePalette functions to realize (compare) any other data in the clipboard against that logical palette.
When displaying clipboard data, the clipboard always uses as its current palette any object on the clipboard that is in the CF_PALETTE format.
CF_PENDATA Data for the pen extensions to the Microsoft® Windows® for Pen Computing.
CF_PRIVATEFIRST through CF_PRIVATELAST Range of integer values for private clipboard formats. Handles associated with private clipboard formats are not freed automatically; the clipboard owner must free such handles, typically in response to the WM_DESTROYCLIPBOARD message.
CF_RIFF Represents audio data more complex than can be represented in a CF_WAVE standard wave format.
CF_SYLK Microsoft Symbolic Link (SYLK) format.
CF_TEXT Text format. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data. Use this format for ANSI text.
CF_WAVE Represents audio data in one of the standard wave formats, such as 11 kHz or 22 kHz pulse code modulation (PCM).
CF_TIFF Tagged-image file format.
CF_UNICODETEXT Windows NT: Unicode text format. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data.

[网络转载] 剪切板的其他操作

拷贝与粘贴文本   
      
  下边的源代码演示了如何将文本(包含在CString对象“source”中)拷贝到剪贴板上。   
    
  CString   source;     
  //put   your   text   in   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;   
  //open   the   clipboard   
  CString   fromClipboard;   
  if   (   OpenClipboard()   )     
  {   
	    HANDLE   hData   =   GetClipboardData(   CF_TEXT   );   
	    char   *   buffer   =   (char*)GlobalLock(   hData   );   
	    fromClipboard   =   buffer;   
	    GlobalUnlock(   hData   );   
	    CloseClipboard();   
  }   
    
  --------------------------------------------------------------------------------   
    
      
    
  拷贝与粘贴WMF(enhanced)数据   
      
  你想在你的程序中往剪贴板上“画”以及向剪贴板读取图形吗?请放心,这个――不难!示范代码如下,其实现的是往剪贴板上写一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;   
  }   
      
    
  好啦,该演示反过来怎么做的代码了。我们从剪贴板上取得metafile并将其画到自己的应用程序的客户区DC(设备上下文)上(仅仅是个试验而已,实际上你可能更想将它拷贝一份儿)。   
    
  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();   
  }   
    
  --------------------------------------------------------------------------------   
    
  拷贝与粘贴一张位图(BitMap)   
      
    
  拷贝和粘贴位图可是需要一些微妙的处理的,不过基本的思想还是一样。请看下面的代码。   
    
  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;   
  }   
      
  如下示例代码是从剪贴板上取得一张位图,将它粘贴到客户区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函数先将此格式注册,然后就可以“为所欲为”了。这简直是太有用了,尤其是在我们自己的应用程序中拷贝资料。假设我们有下面的结构:   
    
  struct   MyFormatData   
  {   
	    long   val1;   
	    int   val2;   
  };   
      
    
  想将此结构的数据拷贝到剪贴板上。可以这样实现:   
    
  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();   
  }   
      
    
  想把它从剪贴板上读下来的话,也容易:   
    
      
    
  //第二次调用时,此格式已经注册过了,读下来就行了   
  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();   
  }   
      
    
    
  --------------------------------------------------------------------------------   
    
      
    
  取得剪贴板变化通知(Getting   notified   of   clipboard   changes)   
      
  一旦剪贴板上的内容发生改变,我们都希望能够获知(经由windows消息),这是很有用的。你可以用函数SetClipboardViewer()来捕获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   
      
  实现为:   
  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();   
  }   
  --------------------------------------------------------------------------------   
    
      
    
  将数据粘贴到其它应用程序窗口中的方法   
      
  我觉得如果能把文本拷贝到剪贴板上(参见上面的代码),然后再在另外一个应用程序中将这些文本粘贴过来,那样才有用。我写了一个很不错的本地应用程序,此程序使用了含有此技术的第三方的语言翻译包。很简单,仅是取得目标窗口的句柄,并向它发送“PASTE”消息就OK了。     
    
	    SendMessage(m_hTextWnd,   WM_PASTE,   0,   0);   

Trackback from your site.

请在这里留言: