参照链接:http://www.flounder.com/metafileexplorer.htm
在参照链接下载项目基础上进行格式解析,主要是分析里面的文本化的数据,
对于EMR_RESERVED_108格式记录解析,网上没什么资料,拿出来跟大家分享下
解析参照资料:https://msdn.microsoft.com/zh-cn/library/cc230599.aspx
typedef struct {
EMR emr;
POINTL ptlReference;
DWORD cChars;
DWORD fuOptions;
DWORD iGraphicsMode;
FLOAT exScale;
FLOAT eyScale;
RECTL rclBounds;
// char* txt;
} EMR_SMALLTEXTOUT;
DWORD ETO_NO_RECT = 0x100;
DWORD SMALLTEXT_TYPE_ANSI = 0x200;
void TreeDecode::DecodeReservedRecord(DECODE_PARAMETERS)
{
GET_CTL_ITEM();
SetState(ctl, item, StateIcon::State);
EMR_SMALLTEXTOUT *txt = ( EMR_SMALLTEXTOUT *)rec;
AddFormattedItem(ctl, item, EMR_SMALLTEXTOUT, txt, POINTL, ptlReference, cvt);
AddFormattedItem(ctl, item, EMR_SMALLTEXTOUT, txt, LONG, cChars, cvt);
CStringW ss;
ss.Format(_T("[type] \"%d "), txt->fuOptions);
ctl->InsertItem(ss, item);
//OutputDebugString(ss);
const LPBYTE base = (BYTE *)rec;
int offString = 36;
CStringW ss="";
if ( (ETO_NO_RECT & txt->fuOptions) != ETO_NO_RECT)
{
AddFormattedItem(ctl, item, EMR_SMALLTEXTOUT, txt, RECTL, rclBounds, cvt);
offString += 16;
ss.Format(_T("%s"), str);
}
CStringW s;
CStringW str = CStringW((LPCSTR)(base + offString), txt->cChars);
if ( (SMALLTEXT_TYPE_ANSI & txt->fuOptions) == SMALLTEXT_TYPE_ANSI ) ansi char
{
s.Format(L"[%d] L\"%ls\"", offString, str);
//str = cvtString(str);
//s.Format(_T("[%d] \"%s\""), offString, str);
}
else ///widechar
{
str = cvtString(str);
s.Format(_T("[%d] \"%s\""), offString, str);
}
ctl->InsertItem(s, item);
} // TreeDecode::DecodeReservedRecord