关于网友提出的“ 如何将剪贴板中的CF_METAFILEPICT类型数据复制到GDI+的Image对象中”问题疑问,本网通过在网上对“ 如何将剪贴板中的CF_METAFILEPICT类型数据复制到GDI+的Image对象中”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 如何将剪贴板中的CF_METAFILEPICT类型数据复制到GDI+的Image对象中
描述:gdi+CF_METAFILEPICT剪贴板
如何将剪贴板中的CF_METAFILEPICT类型数据复制到GDI+的Image对象中?
剪贴板中的数据是从word中的copyasPicture拷贝进来的,现在要复制到GDI+的Image对象中,不知怎么回事没有成功。
代码如下:
if (IsClipboardFormatAvailable(CF_METAFILEPICT))
{
GLOBALHANDLE hGMem;
LPMETAFILEPICT lpMFP;
OpenClipboard(NULL);
hGMem = GetClipboardData(CF_METAFILEPICT);
lpMFP = (LPMETAFILEPICT)GlobalLock(hGMem);
IStream *pstm = NULL;
CreateStreamOnHGlobal(lpMFP, FALSE, &pstm);
if (pstm == NULL)
return FALSE;
CDrawBmp * pObj = new CDrawBmp(m_pDoc);
m_image = Gdiplus::Metafile::FromStream(pstm);
pstm->Release();
GlobalUnlock(hGMem);
//清空剪贴板
EmptyClipboard();
CloseClipboard();
}
解决方案1: 找到一个办法
BOOL CALLBACK MyProc (EmfPlusRecordType recordType,UINT flags,UINT dataSize,const BYTE* data,VOID *callbackData)
{
Metafile *pMtf=(Metafile *)callbackData;
pMtf->PlayRecord(recordType,flags,dataSize,data);
return TRUE;
}
//
void PasteWmf(CDC *pDC)
{// In "word" Selete an Title text such as "哈哈" , then copy text to c.b.
if (IsClipboardFormatAvailable(CF_METAFILEPICT))// =3 and CF_ENHMETAFILE = 14
{
HGLOBAL hMem ;
LPMETAFILEPICT lpMFP ;
OpenClipboard(NULL) ;
hMem = GetClipboardData(CF_METAFILEPICT) ;
lpMFP = (LPMETAFILEPICT)GlobalLock(hMem) ;
CloseClipboard() ;
//
Bitmap CacheImage(100, 100, 40, PixelFormat32bppARGB,0);
Graphics CacheGraphics(&CacheImage );
// 对 CacheImage 进行描画
SolidBrush brush(Color(255,255,255,255));// argb
CacheGraphics.FillRectangle(&brush,0,0,100,100);//
Metafile metafile(lpMFP->hMF,0);// 0: not Aldus Placeable Metafiles
CacheGraphics.EnumerateMetafile(&metafile, PointF(0,0),MyProc,&metafile);
// 获得窗口的 Graphics 对象
Graphics Graphic(pDC->m_hDC);
// 将描画好的 CacheImage 画到窗口上
Graphic.DrawImage(&CacheImage, 20, 20);
GlobalUnlock(hMem);
}
}
以上介绍了“ 如何将剪贴板中的CF_METAFILEPICT类型数据复制到GDI+的Image对象中”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2186480.html