[转] MFC剪贴板操作

本文主要介绍了VC++语句语言/MFC中如下内容的剪贴板操作:

  1、文本内容的操作

  2、WMF数据的操作

  3、位图的操作

  4、设置应用自定义各式

  5、感知剪贴板内容的改变

  6、自动将数据粘贴到另一应用程式窗口

 

一、文本内容的操作

  下面的代码示范了怎能将文本内容复制到剪贴板(Unicode编码的先转化为ASCII):

 

 1 CString source;
 2 //文本内容保存在source变量中
 3 if( OpenClipboard() )
 4 {
 5     HGLOBAL clipbuffer;
 6     char * buffer;
 7     EmptyClipboard();
 8     clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength()+1);
 9     buffer = (char*)GlobalLock(clipbuffer);
10     strcpy(buffer, LPCSTR(source));
11     GlobalUnlock(clipbuffer);
12     SetClipboard数据(CF_TEXT,clipbuffer);
13     CloseClipboard();
14 }

下面的代码呈现了怎能从剪贴板上获得文本内容:

 1 char * buffer = NULL;
 2 //打开剪贴板
 3 CString fromClipboard;
 4 if ( OpenClipboard() )
 5 {
 6     HANDLE h数据 = GetClipboard数据(CF_TEXT);
 7     char * buffer = (char*)GlobalLock(h数据);
 8     fromClipboard = buffer;
 9     GlobalUnlock(h数据);
10     CloseClipboard();
11 }

二、WMF数据的操作
  在剪贴板上读写图象数据是非比寻常有用的功能,并且呈现起来也很简单。下面的代码呈现了怎能将扩展图元文档复制到剪贴板:

 1 if(OpenClipboard());
 2 {
 3      EmptyClipboard();
 4      //创建图元文档DC
 5      CMetaFileDC * cDC = new CMetaFileDC();
 6      cDC->CreateEnhanced(GetDC(),NULL,NULL,"the_name");
 7      //调用绘图例程
 8      //关闭CMetafileDC并获得它的句柄
 9      HENHMETAFILE handle = cDC->CloseEnhanced();
10      //复制到剪贴板
11      SetClipBoard数据(CF_ENHMETAFILE,handle);
12      CloseClipboard();
13      //删除dc
14      delete cDC;
15 }

  下面的代码演示了从剪贴板获得图元文档并将其绘制到client DC上:

if(OpenClipboard())
{
    //获得剪贴板数据
    HENMETAFILE handle = (HENMETAFILE)GetClipboard数据(CF_ENHMETAFILE);
    //呈现
    CClientDC dc(this);
    CRect client(0,0,200,200);
    dc.PlayMetaFile(handle,client);
    //关闭剪贴板
    CloseClipboard();
}

三、位图的操作
  位图的操作稍微复杂一点,下面那个例子呈现了怎能在剪贴板保存位图:

 1 if(OpenClipboard())
 2 {
 3     EmptyClipboard();
 4     CBitmap * junk = new CBitmap();
 5     CClientDC cdc(this);
 6     CDC dc;
 7     dc.CreateCompatibleDC(&cdc);
 8     CRect client(0,0,200,200);
 9     junk->CreateCompatibleBitmap(&cdc,client.Width(),client.Height());
10     dc.SelectObject(junk);
11     DrawImage(&dc,CString("Bitmap"));
12     //复制数据到剪贴板
13     SetClipboard数据(CF_BITMAP,junk->m_hObject);
14     CloseClipboard();
15     delete junk;
16 }

  下面的代码呈现了怎能从剪贴板上获得位图数据:

 1 if(OpenClipboard())
 2 {
 3     //获得剪贴板数据
 4     HBITMAP handle = (HBITMAP)GetClipboard数据(CF_BITMAP);
 5     CBitmap * bm = CBitmap::FromHandle(handle);
 6     CClientDC cdc(this);
 7     CDC dc;
 8     dc.CreateCompatibleDC(&cdc);
 9     dc.SelectObject(bm);
10     cdc.BitBlt(0,0,200,200,&dc,0,0,SRCCOPY);   
11     CloseClipboard();
12 }

四、设置并应用自定义各式
  应用RegisterClipboardFormat()参数,没出国疑问复制和粘贴任何你需求的数据TYPE。比如咱们有以下唯一的数据TYPE:

struct MyFormat数据
{
    long val1;
    int val2;
};

  咱们要把它复制到剪贴板,没出国疑问应用如下的代码:

UINT format = RegisterClipBoardFormat("MY_CUSTOM_FORMAT");
if(OpenClipboard())
{
    MyFormat数据 data;
    data.val1 = 100;
    data.val2 = 200;
    HGLOBAL clipbuffer;
    EmptyClipboard();
    clipbuffer = GlobalAlloc(GMEM_DDESHARE, sizeof(MyFormat数据));
    MyFormat数据 * buffer = (MyFormat数据*)GlobalLock(clipbuffer);
    //保存到内存
    *buffer = data;
    //保存到剪贴板
    GlobalUnlock(clipbuffer);
    SetClipboard数据(format,clipbuffer);
    CloseClipboard();
}

  读取数据应用以下代码:

UINT format = RegisterClipboardFormat("MY_CUSTOM_FORMAT");
MyFormat数据 data;
if(Openclipboard())
{
    HANDLE h数据 =GetClipboard数据(format);
    MyFormat数据 * buffer = (MyFormat数据*)GlobalLock(h数据);
    data = *buffer;
    GlobalUnlock(h数据);
    CloseClipboard();
}

五、感知剪贴板内容的改变
  经过win界面消息没出国疑问感知剪贴板内容也许除了改变,代码如下:

 1 //In your initialization code call:
 2 SetClipboardViewer(); //将咱们的程式添加到剪贴板观察链
 3 //In your message map add:
 4 ON_MESSAGE(WM_DRAWCLIPBOARD, OnClipChange) //添加Message handle
 5 //Which is declared as:
 6 afx_msg void OnClipChange();
 7 Finally implement:
 8 void CDetectClipboardChangeDlg::OnClipChange() 
 9 {
10     CTime time = CTime::GetCurrentTime();
11     SetDlgItemText(IDC_CHANGED_DATE,time.Format("%a, %b %d, %Y -- %H:%M:%S"));
12     DisplayClipboardText();
13 }

 

 

posted @ 2012-07-09 11:18  海螺一枚  阅读(1061)  评论(0编辑  收藏  举报