收藏 分销(赏)

MFC中对剪切板的各种操作.docx

上传人:pc****0 文档编号:9211205 上传时间:2025-03-17 格式:DOCX 页数:7 大小:15.23KB 下载积分:10 金币
下载 相关 举报
MFC中对剪切板的各种操作.docx_第1页
第1页 / 共7页
MFC中对剪切板的各种操作.docx_第2页
第2页 / 共7页


点击查看更多>>
资源描述
MFC中对剪切板的各种操作 2009-10-30 21:02:14 标签:C++  拷贝与粘贴文本           下边的源代码演示了如何将文本(包含在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);  
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 百科休闲 > 社会民生

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服