我的程序需要做一个从剪贴板中获取图形的功能.
剪贴板中数据格式为:CF_METAFILEPICT或(和)CF_ENHMETAFILE
请问有没有什么办法获取到剪贴板中图形的具体尺寸大小.

解决方案 »

  1.   

    这个问题已经解决了.现在把解决方法贴在下面.供大家参考.
    span><span class="S0"></span><br />
    <span class="S2">//#include &lt;atlimage.h&gt;&nbsp;// for CImage</span><br />
    <span class="S2">//#include &lt;comdef.h&gt;</span><br />
    <span class="S2">//#include &lt;math.h&gt;&nbsp; &nbsp; &nbsp;// 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">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="S2">// 1判断剪切板中数据格式</span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span>COleDataObject<span class="S0"> </span>obj<span class="S10">;</span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span>FORMATETC<span class="S0"> </span>fm<span class="S10">;</span>memset<span class="S10">(&amp;</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">&nbsp; &nbsp; &nbsp; &nbsp; </span>obj<span class="S10">.</span>AttachClipboard<span class="S10">();</span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </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">,&amp;</span>fm<span class="S10">);</span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="S5">if</span><span class="S10">(!</span>bRet<span class="S10">)</span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="S5">return</span><span class="S0"> </span><span class="S4">0</span><span class="S10">;</span><br />
    <br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span>GLOBALHANDLE<span class="S0"> &nbsp;&nbsp;&nbsp;</span>hGMem<span class="S0"> </span><span class="S10">=</span><span class="S0"> &nbsp;</span>obj<span class="S10">.</span>GetGlobalData<span class="S10">(</span>CF_METAFILEPICT<span class="S10">);</span><br />
    <br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="S5">if</span><span class="S10">(</span>hGMem<span class="S10">==</span>NULL<span class="S10">)</span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="S5">return</span><span class="S0"> </span><span class="S4">0</span><span class="S10">;</span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span>LPMETAFILEPICT<span class="S0"> &nbsp;</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">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="S5">if</span><span class="S10">(</span>lpMFP<span class="S10">==</span>NULL<span class="S10">)</span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="S5">return</span><span class="S0"> </span><span class="S4">0</span><span class="S10">;</span><br />
    <br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="S2">// 2计算图像的大小</span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span>CImage<span class="S0"> </span>img1<span class="S10">;</span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </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">&nbsp; &nbsp; &nbsp; &nbsp; </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">&nbsp; &nbsp; &nbsp; &nbsp; </span>POINT<span class="S0"> </span>pt<span class="S10">=</span><span class="S0"> </span><span class="S10">{</span>lpMFP<span class="S10">-&gt;</span>xExt<span class="S10">,</span>lpMFP<span class="S10">-&gt;</span>yExt<span class="S10">};</span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span>pDC<span class="S10">-&gt;</span>SaveDC<span class="S10">();</span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span>pDC<span class="S10">-&gt;</span>SetMapMode<span class="S10">(</span>MM_HIMETRIC<span class="S10">);</span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span>pDC<span class="S10">-&gt;</span>LPtoDP<span class="S10">(&amp;</span>pt<span class="S10">);</span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span>pDC<span class="S10">-&gt;</span>RestoreDC<span class="S10">(-</span><span class="S4">1</span><span class="S10">);</span><br />
    <br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span>img1<span class="S10">.</span>ReleaseDC<span class="S10">();</span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span>img1<span class="S10">.</span>Destroy<span class="S10">();</span><br />
    <br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="S2">// 3 按照剪切板中图像大小重新创建图片,准备接收图形数据</span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </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">&nbsp; &nbsp; &nbsp; &nbsp; </span>CRect<span class="S0"> &nbsp;</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">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="S2">// 根据计算好的大小imgRect对图像进行对应的操作</span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="S10">...</span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="S10">...</span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp;  </span><br />
    <br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="S2">// 5释放使用的GDI资源 obj.GetGlobalData(CF_METAFILEPICT);</span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="S10">::</span>DeleteMetaFile<span class="S10">(</span>lpMFP<span class="S10">-&gt;</span>hMF<span class="S10">);</span><br />
    <br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="S2">// 6解锁剪贴板</span><br />
    <span class="S0">&nbsp; &nbsp; &nbsp; &nbsp; </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">&nbsp; &nbsp; &nbsp; &nbsp; </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>
      

  2.   

    这个问题已经解决了.现在把解决方法贴在下面.供大家参考.//#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;
    }