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);
  • 相关阅读:
    python,抓取百度搜索结果
    python关键字 with
    python 字符串处理
    采用主动模式进行文件的上传、下载
    系统的备份和恢复
    javascript中的defer
    程序调用批处理完成上传、下载
    vb.net中的ftp上传、拨号、socket通讯的源码
    CF1033G Chip Game
    LG3369 普通平衡树
  • 原文地址:https://www.cnblogs.com/carl2380/p/1915648.html
Copyright © 2011-2022 走看看