VC 粘贴 CF_METAFILEPICT 格式 MetaFile

来源:互联网 发布:linux服务器设置ip地址 编辑:程序博客网 时间:2024/06/08 16:04
BOOL CALLBACK MyProc (EmfPlusRecordType recordType,UINT flags,UINT dataSize,const BYTE* data,VOID *callbackData)
{
// 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 << dataSize << "\n";// 100
break;
case EMR_EOF ://
afxDump << "EMR_EOF \n";
afxDump << dataSize << "\n";// 12
break;
case EMR_SETTEXTCOLOR :// or 背景色
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;
}
//
int CALLBACK MyProc1 (HDC hdc, HANDLETABLE FAR* pTable, METARECORD FAR* pMetaRecord, int nHandles, LPARAM callbackData)
{
// afxDump << nHandles << "\n";// =2
PlayMetaFileRecord(hdc, pTable, pMetaRecord, nHandles);
return TRUE;
}
//
void PasteWmf(CDC *pDC)
{// In "word" Select a string such as "哈哈" , then copy text to c.b.,
 // or insert a ".wmf" file also copy to c.b.
if (!IsClipboardFormatAvailable(CF_METAFILEPICT))// =3 and CF_ENHMETAFILE = 14
{
AfxMessageBox("Please copy any text from \"Word\" first!");
return;
}
HGLOBAL  hMem ;
LPMETAFILEPICT  lpMFP ;
OpenClipboard(NULL) ;
hMem = GetClipboardData(CF_METAFILEPICT) ;
lpMFP = (LPMETAFILEPICT)GlobalLock(hMem) ;
CloseClipboard();
afxDump << lpMFP->mm << ";" << lpMFP->xExt << ";" << lpMFP->yExt << "\n";// 8;22013;847
#if 1 // use gdiplus
// 从 lpMFP->hMF 到 metafile ,不必用 Stream
Metafile metafile(lpMFP->hMF,0);// 0: not Aldus Placeable Metafiles
int Width=metafile.GetWidth();
int Height=metafile.GetHeight();
#define MARGIN 5  // or =0
// or
// MetafileHeader head;
// metafile.GetMetafileHeader(&head);
// 创建 CacheImage
Bitmap CacheImage(Width+2*MARGIN, Height+2*MARGIN);// PixelFormat32bppARGB  
Graphics CacheGraphics(&CacheImage );  
// 对 CacheImage 进行描画 
SolidBrush brush(Color(255,252,252,100));// argb yellow
CacheGraphics.FillRectangle(&brush,0,0,Width+2*MARGIN,Height+2*MARGIN);//
// playrecord 到 CacheImage
CacheGraphics.EnumerateMetafile(&metafile, Point(MARGIN,MARGIN),MyProc,&metafile);
// 获得窗口的 Graphics 对象  
Graphics Graphic(pDC->m_hDC);  
// 将描画好的 CacheImage 画到窗口上  
Graphic.DrawImage(&CacheImage,2, 20);
#else  // use gdi
pDC->SetMapMode(lpMFP->mm) ;// MM_ANISOTROPIC
pDC->SetViewportOrg(0,0);   //
POINT pt;
pt.x=(int)((double)lpMFP->xExt/25.4);
pt.y=(int)((double)lpMFP->yExt/25.4);
pDC->SetViewportExt(pt.x, pt.y);
EnumMetaFile(pDC->m_hDC,lpMFP->hMF,MyProc1,0);
#endif
GlobalUnlock(hMem);
}
0 0