zoukankan      html  css  js  c++  java
  • VC 剪贴板操作

    http://www.360doc.com/content/08/0624/16/61809_1365858.shtml

    拷贝与粘贴文本

    下边的源代码演示了如何将文本(包含在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);
  • 相关阅读:
    如何在iTerm2中配置oh my zsh?
    sublime中格式化jsx文件
    ES6 new syntax of Literal
    ES6 new syntax of Rest and Spread Operators
    How to preview html file in our browser at sublime text?
    ES6 new syntax of Default Function Parameters
    ES6 new syntax of Arrow Function
    七牛云2018春招笔试题
    Spring-使用注解开发(十二)
    Spring-声明式事物(十一)
  • 原文地址:https://www.cnblogs.com/carl2380/p/1924586.html
Copyright © 2011-2022 走看看