剪贴板中图形的大小 我的程序需要做一个从剪贴板中获取图形的功能.剪贴板中数据格式为:CF_METAFILEPICT或(和)CF_ENHMETAFILE请问有没有什么办法获取到剪贴板中图形的具体尺寸大小. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个问题已经解决了.现在把解决方法贴在下面.供大家参考.span><span class="S0"></span><br /><span class="S2">//#include <atlimage.h> // for CImage</span><br /><span class="S2">//#include <comdef.h></span><br /><span class="S2">//#include <math.h> // for abs</span><br /><br /><span class="S5">int</span><span class="S0"> </span>PasteMetaGraph<span class="S10">(</span><span class="S5">void</span><span class="S10">)</span><br /><span class="S10">{</span><br /><span class="S0"> </span><span class="S2">// 1判断剪切板中数据格式</span><br /><span class="S0"> </span>COleDataObject<span class="S0"> </span>obj<span class="S10">;</span><br /><span class="S0"> </span>FORMATETC<span class="S0"> </span>fm<span class="S10">;</span>memset<span class="S10">(&</span>fm<span class="S10">,</span><span class="S4">0</span><span class="S10">,</span><span class="S5">sizeof</span><span class="S10">(</span>fm<span class="S10">));</span><br /><span class="S0"> </span>obj<span class="S10">.</span>AttachClipboard<span class="S10">();</span><br /><span class="S0"> </span>BOOL<span class="S0"> </span>bRet<span class="S0"> </span><span class="S10">=</span><span class="S0"> </span>obj<span class="S10">.</span>IsDataAvailable<span class="S10">(</span>CF_METAFILEPICT<span class="S10">,&</span>fm<span class="S10">);</span><br /><span class="S0"> </span><span class="S5">if</span><span class="S10">(!</span>bRet<span class="S10">)</span><br /><span class="S0"> </span><span class="S5">return</span><span class="S0"> </span><span class="S4">0</span><span class="S10">;</span><br /><br /><span class="S0"> </span>GLOBALHANDLE<span class="S0"> </span>hGMem<span class="S0"> </span><span class="S10">=</span><span class="S0"> </span>obj<span class="S10">.</span>GetGlobalData<span class="S10">(</span>CF_METAFILEPICT<span class="S10">);</span><br /><br /><span class="S0"> </span><span class="S5">if</span><span class="S10">(</span>hGMem<span class="S10">==</span>NULL<span class="S10">)</span><br /><span class="S0"> </span><span class="S5">return</span><span class="S0"> </span><span class="S4">0</span><span class="S10">;</span><br /><span class="S0"> </span>LPMETAFILEPICT<span class="S0"> </span>lpMFP<span class="S0"> </span><span class="S10">=</span><span class="S0"> </span><span class="S10">(</span>LPMETAFILEPICT<span class="S10">)</span>GlobalLock<span class="S10">(</span>hGMem<span class="S10">)</span><span class="S0"> </span><span class="S10">;</span><br /><span class="S0"> </span><span class="S5">if</span><span class="S10">(</span>lpMFP<span class="S10">==</span>NULL<span class="S10">)</span><br /><span class="S0"> </span><span class="S5">return</span><span class="S0"> </span><span class="S4">0</span><span class="S10">;</span><br /><br /><span class="S0"> </span><span class="S2">// 2计算图像的大小</span><br /><span class="S0"> </span>CImage<span class="S0"> </span>img1<span class="S10">;</span><br /><span class="S0"> </span>img1<span class="S10">.</span>Create<span class="S10">(</span><span class="S4">1</span><span class="S10">,</span><span class="S4">1</span><span class="S10">,</span><span class="S4">32</span><span class="S10">);</span><br /><span class="S0"> </span>CDC<span class="S10">*</span><span class="S0"> </span>pDC<span class="S0"> </span><span class="S10">=</span><span class="S0"> </span>CDC<span class="S10">::</span>FromHandle<span class="S10">(</span>img1<span class="S10">.</span>GetDC<span class="S10">());</span><br /><span class="S0"> </span>POINT<span class="S0"> </span>pt<span class="S10">=</span><span class="S0"> </span><span class="S10">{</span>lpMFP<span class="S10">-></span>xExt<span class="S10">,</span>lpMFP<span class="S10">-></span>yExt<span class="S10">};</span><br /><span class="S0"> </span>pDC<span class="S10">-></span>SaveDC<span class="S10">();</span><br /><span class="S0"> </span>pDC<span class="S10">-></span>SetMapMode<span class="S10">(</span>MM_HIMETRIC<span class="S10">);</span><br /><span class="S0"> </span>pDC<span class="S10">-></span>LPtoDP<span class="S10">(&</span>pt<span class="S10">);</span><br /><span class="S0"> </span>pDC<span class="S10">-></span>RestoreDC<span class="S10">(-</span><span class="S4">1</span><span class="S10">);</span><br /><br /><span class="S0"> </span>img1<span class="S10">.</span>ReleaseDC<span class="S10">();</span><br /><span class="S0"> </span>img1<span class="S10">.</span>Destroy<span class="S10">();</span><br /><br /><span class="S0"> </span><span class="S2">// 3 按照剪切板中图像大小重新创建图片,准备接收图形数据</span><br /><span class="S0"> </span>CSize<span class="S0"> </span>szNew<span class="S10">(</span>abs<span class="S10">(</span>pt<span class="S10">.</span>x<span class="S10">),</span>abs<span class="S10">(</span>pt<span class="S10">.</span>y<span class="S10">));</span><br /><span class="S0"> </span>CRect<span class="S0"> </span>imgRect<span class="S10">(</span>CPoint<span class="S10">(</span><span class="S4">0</span><span class="S10">,</span><span class="S4">0</span><span class="S10">),</span>szNew<span class="S10">);</span><br /><span class="S0"> </span><br /><span class="S0"> </span><span class="S2">// 根据计算好的大小imgRect对图像进行对应的操作</span><br /><span class="S0"> </span><br /><span class="S0"> </span><span class="S10">...</span><br /><span class="S0"> </span><span class="S10">...</span><br /><span class="S0"> </span><br /><br /><span class="S0"> </span><span class="S2">// 5释放使用的GDI资源 obj.GetGlobalData(CF_METAFILEPICT);</span><br /><span class="S0"> </span><span class="S10">::</span>DeleteMetaFile<span class="S10">(</span>lpMFP<span class="S10">-></span>hMF<span class="S10">);</span><br /><br /><span class="S0"> </span><span class="S2">// 6解锁剪贴板</span><br /><span class="S0"> </span>BOOL<span class="S0"> </span>b1<span class="S0"> </span><span class="S10">=</span><span class="S0"> </span>GlobalUnlock<span class="S10">(</span>hGMem<span class="S10">)</span><span class="S0"> </span><span class="S10">;</span><br /><br /><br /><br /><span class="S0"> </span><span class="S5">return</span><span class="S0"> </span><span class="S4">1</span><span class="S10">;</span><br /><span class="S10">}</span></span> 这个问题已经解决了.现在把解决方法贴在下面.供大家参考.//#include <atlimage.h> // for CImage//#include <comdef.h>//#include <math.h> // for absint PasteMetaGraph(void){ // 1判断剪切板中数据格式 COleDataObject obj; FORMATETC fm;memset(&fm,0,sizeof(fm)); obj.AttachClipboard(); BOOL bRet = obj.IsDataAvailable(CF_METAFILEPICT,&fm); if(!bRet) return 0; GLOBALHANDLE hGMem = obj.GetGlobalData(CF_METAFILEPICT); if(hGMem==NULL) return 0; LPMETAFILEPICT lpMFP = (LPMETAFILEPICT)GlobalLock(hGMem) ; if(lpMFP==NULL) return 0; // 2计算图像的大小 CImage img1; img1.Create(1,1,32); CDC* pDC = CDC::FromHandle(img1.GetDC()); POINT pt= {lpMFP->xExt,lpMFP->yExt}; pDC->SaveDC(); pDC->SetMapMode(MM_HIMETRIC); pDC->LPtoDP(&pt); pDC->RestoreDC(-1); img1.ReleaseDC(); img1.Destroy(); // 3 按照剪切板中图像大小重新创建图片,准备接收图形数据 CSize szNew(abs(pt.x),abs(pt.y)); CRect imgRect(CPoint(0,0),szNew); // 根据计算好的大小imgRect对图像进行对应的操作 ... ... // 5释放使用的GDI资源 obj.GetGlobalData(CF_METAFILEPICT); ::DeleteMetaFile(lpMFP->hMF); // 6解锁剪贴板 BOOL b1 = GlobalUnlock(hGMem) ; return 1;} 如何把一个硬盘的所有文件复制到别的盘的制定目录下? 关于非模式对话框问题 简单问题 新手请问:CSocket类怎么把他弄成异步的呀?谢谢 在WINDOWS 2000/NT下如何用VC++实现对端口的操作 很简单的问题,如何在调用窗体的同时设置窗体的大小?(在线给分) afx_msg是什么? 极弱智的问题,关于radiobutton 我有一个提议,等潘爱民的c++ primer出了以后,我们大家自愿在csdn立几个贴子作勘误好不好? 怎样才能在View中收到SliderBar的消息? (急!!,一定给分) meun选择获取文本 如何进一步学习VC,高手指点
span><span class="S0"></span><br />
<span class="S2">//#include <atlimage.h> // for CImage</span><br />
<span class="S2">//#include <comdef.h></span><br />
<span class="S2">//#include <math.h> // for abs</span><br />
<br />
<span class="S5">int</span><span class="S0"> </span>PasteMetaGraph<span class="S10">(</span><span class="S5">void</span><span class="S10">)</span><br />
<span class="S10">{</span><br />
<span class="S0"> </span><span class="S2">// 1判断剪切板中数据格式</span><br />
<span class="S0"> </span>COleDataObject<span class="S0"> </span>obj<span class="S10">;</span><br />
<span class="S0"> </span>FORMATETC<span class="S0"> </span>fm<span class="S10">;</span>memset<span class="S10">(&</span>fm<span class="S10">,</span><span class="S4">0</span><span class="S10">,</span><span class="S5">sizeof</span><span class="S10">(</span>fm<span class="S10">));</span><br />
<span class="S0"> </span>obj<span class="S10">.</span>AttachClipboard<span class="S10">();</span><br />
<span class="S0"> </span>BOOL<span class="S0"> </span>bRet<span class="S0"> </span><span class="S10">=</span><span class="S0"> </span>obj<span class="S10">.</span>IsDataAvailable<span class="S10">(</span>CF_METAFILEPICT<span class="S10">,&</span>fm<span class="S10">);</span><br />
<span class="S0"> </span><span class="S5">if</span><span class="S10">(!</span>bRet<span class="S10">)</span><br />
<span class="S0"> </span><span class="S5">return</span><span class="S0"> </span><span class="S4">0</span><span class="S10">;</span><br />
<br />
<span class="S0"> </span>GLOBALHANDLE<span class="S0"> </span>hGMem<span class="S0"> </span><span class="S10">=</span><span class="S0"> </span>obj<span class="S10">.</span>GetGlobalData<span class="S10">(</span>CF_METAFILEPICT<span class="S10">);</span><br />
<br />
<span class="S0"> </span><span class="S5">if</span><span class="S10">(</span>hGMem<span class="S10">==</span>NULL<span class="S10">)</span><br />
<span class="S0"> </span><span class="S5">return</span><span class="S0"> </span><span class="S4">0</span><span class="S10">;</span><br />
<span class="S0"> </span>LPMETAFILEPICT<span class="S0"> </span>lpMFP<span class="S0"> </span><span class="S10">=</span><span class="S0"> </span><span class="S10">(</span>LPMETAFILEPICT<span class="S10">)</span>GlobalLock<span class="S10">(</span>hGMem<span class="S10">)</span><span class="S0"> </span><span class="S10">;</span><br />
<span class="S0"> </span><span class="S5">if</span><span class="S10">(</span>lpMFP<span class="S10">==</span>NULL<span class="S10">)</span><br />
<span class="S0"> </span><span class="S5">return</span><span class="S0"> </span><span class="S4">0</span><span class="S10">;</span><br />
<br />
<span class="S0"> </span><span class="S2">// 2计算图像的大小</span><br />
<span class="S0"> </span>CImage<span class="S0"> </span>img1<span class="S10">;</span><br />
<span class="S0"> </span>img1<span class="S10">.</span>Create<span class="S10">(</span><span class="S4">1</span><span class="S10">,</span><span class="S4">1</span><span class="S10">,</span><span class="S4">32</span><span class="S10">);</span><br />
<span class="S0"> </span>CDC<span class="S10">*</span><span class="S0"> </span>pDC<span class="S0"> </span><span class="S10">=</span><span class="S0"> </span>CDC<span class="S10">::</span>FromHandle<span class="S10">(</span>img1<span class="S10">.</span>GetDC<span class="S10">());</span><br />
<span class="S0"> </span>POINT<span class="S0"> </span>pt<span class="S10">=</span><span class="S0"> </span><span class="S10">{</span>lpMFP<span class="S10">-></span>xExt<span class="S10">,</span>lpMFP<span class="S10">-></span>yExt<span class="S10">};</span><br />
<span class="S0"> </span>pDC<span class="S10">-></span>SaveDC<span class="S10">();</span><br />
<span class="S0"> </span>pDC<span class="S10">-></span>SetMapMode<span class="S10">(</span>MM_HIMETRIC<span class="S10">);</span><br />
<span class="S0"> </span>pDC<span class="S10">-></span>LPtoDP<span class="S10">(&</span>pt<span class="S10">);</span><br />
<span class="S0"> </span>pDC<span class="S10">-></span>RestoreDC<span class="S10">(-</span><span class="S4">1</span><span class="S10">);</span><br />
<br />
<span class="S0"> </span>img1<span class="S10">.</span>ReleaseDC<span class="S10">();</span><br />
<span class="S0"> </span>img1<span class="S10">.</span>Destroy<span class="S10">();</span><br />
<br />
<span class="S0"> </span><span class="S2">// 3 按照剪切板中图像大小重新创建图片,准备接收图形数据</span><br />
<span class="S0"> </span>CSize<span class="S0"> </span>szNew<span class="S10">(</span>abs<span class="S10">(</span>pt<span class="S10">.</span>x<span class="S10">),</span>abs<span class="S10">(</span>pt<span class="S10">.</span>y<span class="S10">));</span><br />
<span class="S0"> </span>CRect<span class="S0"> </span>imgRect<span class="S10">(</span>CPoint<span class="S10">(</span><span class="S4">0</span><span class="S10">,</span><span class="S4">0</span><span class="S10">),</span>szNew<span class="S10">);</span><br />
<span class="S0"> </span><br />
<span class="S0"> </span><span class="S2">// 根据计算好的大小imgRect对图像进行对应的操作</span><br />
<span class="S0"> </span><br />
<span class="S0"> </span><span class="S10">...</span><br />
<span class="S0"> </span><span class="S10">...</span><br />
<span class="S0"> </span><br />
<br />
<span class="S0"> </span><span class="S2">// 5释放使用的GDI资源 obj.GetGlobalData(CF_METAFILEPICT);</span><br />
<span class="S0"> </span><span class="S10">::</span>DeleteMetaFile<span class="S10">(</span>lpMFP<span class="S10">-></span>hMF<span class="S10">);</span><br />
<br />
<span class="S0"> </span><span class="S2">// 6解锁剪贴板</span><br />
<span class="S0"> </span>BOOL<span class="S0"> </span>b1<span class="S0"> </span><span class="S10">=</span><span class="S0"> </span>GlobalUnlock<span class="S10">(</span>hGMem<span class="S10">)</span><span class="S0"> </span><span class="S10">;</span><br />
<br />
<br />
<br />
<span class="S0"> </span><span class="S5">return</span><span class="S0"> </span><span class="S4">1</span><span class="S10">;</span><br />
<span class="S10">}</span></span>
//#include <comdef.h>
//#include <math.h> // for absint PasteMetaGraph(void)
{
// 1判断剪切板中数据格式
COleDataObject obj;
FORMATETC fm;memset(&fm,0,sizeof(fm));
obj.AttachClipboard();
BOOL bRet = obj.IsDataAvailable(CF_METAFILEPICT,&fm);
if(!bRet)
return 0; GLOBALHANDLE hGMem = obj.GetGlobalData(CF_METAFILEPICT); if(hGMem==NULL)
return 0;
LPMETAFILEPICT lpMFP = (LPMETAFILEPICT)GlobalLock(hGMem) ;
if(lpMFP==NULL)
return 0; // 2计算图像的大小
CImage img1;
img1.Create(1,1,32);
CDC* pDC = CDC::FromHandle(img1.GetDC());
POINT pt= {lpMFP->xExt,lpMFP->yExt};
pDC->SaveDC();
pDC->SetMapMode(MM_HIMETRIC);
pDC->LPtoDP(&pt);
pDC->RestoreDC(-1); img1.ReleaseDC();
img1.Destroy(); // 3 按照剪切板中图像大小重新创建图片,准备接收图形数据
CSize szNew(abs(pt.x),abs(pt.y));
CRect imgRect(CPoint(0,0),szNew);
// 根据计算好的大小imgRect对图像进行对应的操作
...
...
// 5释放使用的GDI资源 obj.GetGlobalData(CF_METAFILEPICT);
::DeleteMetaFile(lpMFP->hMF); // 6解锁剪贴板
BOOL b1 = GlobalUnlock(hGMem) ; return 1;
}