如何将剪贴板中的CF_METAFILEPICT类型数据复制到GDI+的Image对象中

wuhf 2015-09-14 10:40:14
如何将剪贴板中的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();

}
...全文
374 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2015-09-21
  • 打赏
  • 举报
回复
在 MyProc 中 可以修改, 如下面是 改 黑字 为 白字

BOOL CALLBACK MyProc (EmfPlusRecordType recordType,UINT flags,UINT dataSize,const BYTE* data,VOID *callbackData)
{// 1= 	recordType	EmfRecordTypeHeader
//#define EMR_HEADER                      1
//#define EMR_EOF                         14
//#define EMR_SETBKMODE                   18
//#define EMR_SETTEXTALIGN                22
//#define EMR_SETTEXTCOLOR                24
//#define EMR_SAVEDC                      33
//#define EMR_RESTOREDC                   34
//#define EMR_SETWORLDTRANSFORM           35
//#define EMR_MODIFYWORLDTRANSFORM        36
//#define EMR_SELECTOBJECT                37
//#define EMR_EXTSELECTCLIPRGN            75
//#define EMR_EXTCREATEFONTINDIRECTW      82
//#define EMR_EXTTEXTOUTW                 84
	afxDump << recordType << ";";//1,14,18,22,24,33,34,35,36,37,75,82,84
	Metafile *pMtf=(Metafile *)callbackData;
	switch (recordType)
	{
	case EMR_HEADER ://
		afxDump << "EMR_HEADER \n";
		afxDump << sizeof(METAHEADER) << "\n";// 140
		afxDump << dataSize << "\n";// 100
	break;
	case EMR_EOF ://
		afxDump << "EMR_EOF \n";
//		afxDump << dataSize << "\n";
	break;
	case EMR_SETTEXTCOLOR ://
		afxDump << "EMR_SETTEXTCOLOR \n";
//		afxDump << dataSize << "\n";// 4
//		afxDump << *(DWORD*)data << "\n";// =0 black
		*(DWORD*)data=0xFFFFFFFF;// white
	break;
	}
	pMtf->PlayRecord(recordType,flags,dataSize,data);
	return TRUE;
}
注意 *(DWORD*)data=0xFFFFFFFF;// white
wuhf 2015-09-20
  • 打赏
  • 举报
回复
引用 13 楼 schlafenhamster 的回复:
找到一个办法

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);
	}
}
解决了。schlafenhamster的这个方法不错,解决了我的问题。感谢,结贴
schlafenhamster 2015-09-19
  • 打赏
  • 举报
回复
找到一个办法

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);
	}
}
schlafenhamster 2015-09-19
  • 打赏
  • 举报
回复
if (IsClipboardFormatAvailable(CF_METAFILEPICT))// =3 and CF_ENHMETAFILE = 14 { HGLOBAL hMem ; LPMETAFILEPICT lpMFP ; OpenClipboard(NULL) ; hMem = GetClipboardData(CF_METAFILEPICT) ; lpMFP = (LPMETAFILEPICT)GlobalLock(hMem) ; CloseClipboard() ; #if 1 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.DrawImage(&metafile,0,0,90,90); // 获得窗口的 Graphics 对象 Graphics Graphic(pDC->m_hDC); // 将描画好的 CacheImage 画到窗口上 Graphic.DrawImage(&CacheImage, 20, 20); 红的那句 可以 创建 成功。不用 Stream
wuhf 2015-09-18
  • 打赏
  • 举报
回复
@蒋晟 你是这里的老专家了,帮帮忙给解释一下。谢谢了
wuhf 2015-09-18
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster 的回复:
问题是 Metafile *metafile=(Metafile*)Image::FromStream(pstm); 不成功 (nativeImage==0, 参数错误)
是的。我用Image::FromStream(pstm);构建Image对象,为何不成功? 请高手指点一二。
wuhf 2015-09-18
  • 打赏
  • 举报
回复
引用 7 楼 liuh2014 的回复:
[quote=引用 6 楼 wuhf 的回复:] 还没有解决,用Gdiplus::Metafile对象能否接收剪贴板中的meta file数据?能够另存出来也行。
CDrawBmp * pObj = new CDrawBmp(m_pDoc); 这句是干什么用的。[/quote] 这句话没有用,是新建了一个我自己的类(CDrawBmp),这个类是用来后期显示image对象的。
schlafenhamster 2015-09-18
  • 打赏
  • 举报
回复
问题是 Metafile *metafile=(Metafile*)Image::FromStream(pstm); 不成功 (nativeImage==0, 参数错误)
伊航 2015-09-18
  • 打赏
  • 举报
回复
引用 6 楼 wuhf 的回复:
还没有解决,用Gdiplus::Metafile对象能否接收剪贴板中的meta file数据?能够另存出来也行。
CDrawBmp * pObj = new CDrawBmp(m_pDoc); 这句是干什么用的。
wuhf 2015-09-17
  • 打赏
  • 举报
回复
还没有解决,用Gdiplus::Metafile对象能否接收剪贴板中的meta file数据?能够另存出来也行。
schlafenhamster 2015-09-16
  • 打赏
  • 举报
回复
gdi+ 可以自己 画: #if 1 // show ani02.wmf CPaintDC dc(this); // device context for painting Bitmap CacheImage(390, 390); Graphics CacheGraphics(&CacheImage ); // 对 CacheImage 进行描画 SolidBrush brush(Color(255,0,128,128));// argb CacheGraphics.FillRectangle(&brush,0,0,390,390);// Image image(L"ani02.wmf"); // CacheGraphics.DrawImage(&image,1,1,390,390); // 获得窗口的 Graphics 对象 Graphics Graphic(dc.m_hDC); // 将描画好的 CacheImage 画到窗口上 Graphic.DrawImage(&CacheImage, 0, 0); #endif
蒋晟 2015-09-15
  • 打赏
  • 举报
回复
meta file里面包含的是GDI指令不是图片。 你可以用PlayMetaFile画到一个内存DC上再抓图。
schlafenhamster 2015-09-15
  • 打赏
  • 举报
回复
CRect metafile(0, 0, 100, 100); // example location if (IsClipboardFormatAvailable(CF_METAFILEPICT)) { // play a metafile from the clipboard if available GLOBALHANDLE hGMem ; LPMETAFILEPICT lpMFP ; OpenClipboard() ; hGMem = GetClipboardData(CF_METAFILEPICT) ; lpMFP = (LPMETAFILEPICT)GlobalLock(hGMem) ; pDC->SaveDC() ; pDC->SetMapMode(lpMFP->mm) ; pDC->SetViewportExt(metafile.Width(), metafile.Height()) ; pDC->SetViewportOrg(metafile.left, metafile.top) ; pDC->PlayMetaFile(lpMFP->hMF) ; VERIFY(pDC->RestoreDC(-1)) ; GlobalUnlock(hGMem) ; CloseClipboard() ; }
wuhf 2015-09-15
  • 打赏
  • 举报
回复
我想把他搞到GDI+的Image对象中怎么搞?
wuhf 2015-09-15
  • 打赏
  • 举报
回复
引用 1 楼 jiangsheng 的回复:
meta file里面包含的是GDI指令不是图片。 你可以用PlayMetaFile画到一个内存DC上再抓图。
用Gdiplus::Metafile无法接受meta file吗?

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧