用代码操纵剪切板

松树发布于搜狐:

拷贝与粘贴文本   
      
  下面的源代码演示了哪些将文件(包涵在CString对象“source”中)拷贝到剪贴板上。  

#ifndef __HSS_AUTO_CLIPBOARD_HSS__
#define __HSS_AUTO_CLIPBOARD_HSS__

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

/*********************************************************************************
*  2012-10-30
自行复制内容到剪贴板

   
  反过来,下边包车型大巴代码是用来贯彻从剪贴板上得到文本的。  

  用法:

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

  复制:
  auto_clipboard a(hwnd, psz);

    
  拷贝与粘贴WMF(enhanced)数据   
      
  你想在您的顺序中往剪贴板上“画”以致向剪贴板读取图形吗?请放心,那一个――简单!示范代码如下,其促成的是往剪贴板上写一enhanced  metafile。  

  粘贴:
  CString sz;
  auto_clipboard::GetText(sz);
***************************************************************************/

    
  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;   
  }          

class auto_clipboard
{
public:
    auto_clipboard(HWND hwnd, LPCTSTR pszText)
    {
        if (::OpenClipboard(hwnd))
        {
            ::EmptyClipboard();

    
  好啊,该演示反过来如何是好的代码了。大家从剪贴板上获得metafile并将其画到本身的应用程序的顾客区DC(设备上下文)上(仅仅是个考试而已,实际上你大概更想将它拷贝一份儿)。        

            HANDLE hMem = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE , strlen(pszText) 1);
            if (hMem)
            {
                char* pszMem = (char*)(::GlobalLock(hMem));
                if (pszMem)
                {
                    strcpy(pszMem, pszText);
                    ::GlobalUnlock(hMem);
                    SetClipboardData(CF_TEXT, hMem);
                }
                ::GlobalFree(hMem);
            }
            CloseClipboard();
        }
    }

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

    ~auto_clipboard()
    {
    }

    
  拷贝与粘贴一张位图(BitMap)        
    
  拷贝和粘贴位图可是须求有的微妙的拍卖的,不过基本的考虑照旧长期以来。请看上面包车型大巴代码。  

    /*************************************************************************
    * auto_clipboard    :    2014年12月2日
    * CString sz        :   
    **************************************************************************/
#ifdef __AFX_H__
    static BOOL GetText(CString& sz)
    {
        if (!OpenClipboard(0))        
            return FALSE;

  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;   
  }

        HANDLE hClip = GetClipboardData(CF_TEXT);

   
      
  如下示例代码是从剪贴板上赢得一张位图,将它粘贴到客商区DC中。  

        if (hClip == 0)
        {
            CloseClipboard();
            return FALSE;
        }

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

        LPVOID pRes = (LPVOID)GlobalLock(hClip);

    
    
  建设构造并利用你自个儿定做的多少格式   
      
  假设你要拷贝、粘贴别的格式的数码,能够用RegisterClipboardFormat()  API函数先将此格式注册,然后就能够“飞扬跋扈”了。那大概是太有用了,尤其是在大家温馨的应用程序中拷贝资料。假如大家有下边包车型的士结构:      

        if (pRes == 0)
        {
            CloseClipboard();
            return FALSE;
        }

  struct  MyFormatData   
  {   
                    long  val1;   
                    int  val2;   
  };  

        sz = (char*)pRes;

          
  想将此布局的数额拷贝到剪贴板上。能够那样完结:  

        GlobalUnlock(hClip);

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

        CloseClipboard();

        
    
  想把它从剪贴板上读下去的话,也轻便:        
    
  //第叁遍调用时,此格式已经登记过了,读下来就行了  

        return TRUE;
    }
#endif
};

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

#endif

      
    
  --------------------------------------------------------------------------------    
      
    
  获得剪贴板变化公告(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);   

本文由星彩网app下载发布于星彩网app下载,转载请注明出处:用代码操纵剪切板

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。