📄 mfutils.cpp
字号:
rec->param3 = getint(handle); // COLORREF
metaRecords.Append(rec);
break;
}
// case META_OFFSETCLIPRGN:
case META_TEXTOUT:
{
wxMetaRecord *rec = new wxMetaRecord(META_TEXTOUT);
int count = getshort(handle);
rec->stringParam = new wxChar[count+1];
fread((void *)rec->stringParam, sizeof(wxChar), count, handle);
rec->stringParam[count] = 0;
rec->param2 = getshort(handle); // Y
rec->param1 = getshort(handle); // X
metaRecords.Append(rec);
break;
}
/*
case META_EXTTEXTOUT:
{
wxMetaRecord *rec = new wxMetaRecord(META_EXTTEXTOUT);
int cellSpacing = getshort(handle);
int count = getshort(handle);
rec->stringParam = new char[count+1];
fread((void *)rec->stringParam, sizeof(char), count, handle);
rec->stringParam[count] = 0;
// Rectangle
int rectY2 = getshort(handle);
int rectX2 = getshort(handle);
int rectY1 = getshort(handle);
int rectX1 = getshort(handle);
int rectType = getshort(handle);
rec->param2 = getshort(handle); // Y
rec->param1 = getshort(handle); // X
metaRecords.Append(rec);
break;
}
*/
// case META_BITBLT:
// case META_STRETCHBLT:
case META_POLYGON:
{
wxMetaRecord *rec = new wxMetaRecord(META_POLYGON);
rec->param1 = getshort(handle);
rec->points = new wxRealPoint[(int)rec->param1];
for (int i = 0; i < rec->param1; i++)
{
rec->points[i].x = getshort(handle);
rec->points[i].y = getshort(handle);
}
metaRecords.Append(rec);
break;
}
case META_POLYLINE:
{
wxMetaRecord *rec = new wxMetaRecord(META_POLYLINE);
rec->param1 = (long)getshort(handle);
rec->points = new wxRealPoint[(int)rec->param1];
for (int i = 0; i < rec->param1; i++)
{
rec->points[i].x = getshort(handle);
rec->points[i].y = getshort(handle);
}
metaRecords.Append(rec);
break;
}
// case META_ESCAPE:
// case META_RESTOREDC:
// case META_FILLREGION:
// case META_FRAMEREGION:
// case META_INVERTREGION:
// case META_PAINTREGION:
// case META_SELECTCLIPREGION: // DO THIS!
case META_SELECTOBJECT:
{
wxMetaRecord *rec = new wxMetaRecord(META_SELECTOBJECT);
rec->param1 = (long)getshort(handle); // Position of object in gdiObjects list
metaRecords.Append(rec);
// param2 gives the index into gdiObjects, which is different from
// the index into the handle table.
rec->param2 = HandleTable[(int)rec->param1]->param2;
break;
}
// case META_SETTEXTALIGN:
// case META_DRAWTEXT:
// case META_CHORD:
// case META_SETMAPPERFLAGS:
// case META_EXTTEXTOUT:
// case META_SETDIBTODEV:
// case META_SELECTPALETTE:
// case META_REALIZEPALETTE:
// case META_ANIMATEPALETTE:
// case META_SETPALENTRIES:
// case META_POLYPOLYGON:
// case META_RESIZEPALETTE:
// case META_DIBBITBLT:
// case META_DIBSTRETCHBLT:
case META_DIBCREATEPATTERNBRUSH:
{
wxMetaRecord *rec = new wxMetaRecord(META_DIBCREATEPATTERNBRUSH);
fread((void *)_buf, sizeof(char), (int)((2*rdSize) - 6), handle);
metaRecords.Append(rec);
gdiObjects.Append(rec);
AddMetaRecordHandle(rec);
rec->param2 = (long)(gdiObjects.GetCount() - 1);
break;
}
// case META_STRETCHDIB:
// case META_EXTFLOODFILL:
// case META_RESETDC:
// case META_STARTDOC:
// case META_STARTPAGE:
// case META_ENDPAGE:
// case META_ABORTDOC:
// case META_ENDDOC:
case META_DELETEOBJECT:
{
int index = getshort(handle);
DeleteMetaRecordHandle(index);
break;
}
case META_CREATEPALETTE:
{
wxMetaRecord *rec = new wxMetaRecord(META_CREATEPALETTE);
fread((void *)_buf, sizeof(char), (int)((2*rdSize) - 6), handle);
metaRecords.Append(rec);
gdiObjects.Append(rec);
AddMetaRecordHandle(rec);
rec->param2 = (long)(gdiObjects.GetCount() - 1);
break;
}
case META_CREATEBRUSH:
{
wxMetaRecord *rec = new wxMetaRecord(META_CREATEBRUSH);
fread((void *)_buf, sizeof(char), (int)((2*rdSize) - 6), handle);
metaRecords.Append(rec);
gdiObjects.Append(rec);
AddMetaRecordHandle(rec);
rec->param2 = (long)(gdiObjects.GetCount() - 1);
break;
}
case META_CREATEPATTERNBRUSH:
{
wxMetaRecord *rec = new wxMetaRecord(META_CREATEPATTERNBRUSH);
fread((void *)_buf, sizeof(char), (int)((2*rdSize) - 6), handle);
metaRecords.Append(rec);
gdiObjects.Append(rec);
AddMetaRecordHandle(rec);
rec->param2 = (long)(gdiObjects.GetCount() - 1);
break;
}
case META_CREATEPENINDIRECT:
{
wxMetaRecord *rec = new wxMetaRecord(META_CREATEPENINDIRECT);
int msStyle = getshort(handle); // Style: 2 bytes
int x = getshort(handle); // X: 2 bytes
/* int y = */ getshort(handle); // Y: 2 bytes
long colorref = getint(handle); // COLORREF 4 bytes
int style;
if (msStyle == PS_DOT)
style = wxDOT;
else if (msStyle == PS_DASH)
style = wxSHORT_DASH;
else if (msStyle == PS_NULL)
style = wxTRANSPARENT;
else style = wxSOLID;
wxColour colour(GetRValue(colorref), GetGValue(colorref), GetBValue(colorref));
rec->param1 = (long)wxThePenList->FindOrCreatePen(colour, x, style);
metaRecords.Append(rec);
gdiObjects.Append(rec);
AddMetaRecordHandle(rec);
rec->param2 = (long)(gdiObjects.GetCount() - 1);
// For some reason, the size of this record is sometimes 9 words!!!
// instead of the usual 8. So read 2 characters extra.
if (rdSize == 9)
{
(void) getshort(handle);
}
break;
}
case META_CREATEFONTINDIRECT:
{
wxMetaRecord *rec = new wxMetaRecord(META_CREATEFONTINDIRECT);
int lfHeight = getshort(handle); // 2 bytes
/* int lfWidth = */ getshort(handle); // 2 bytes
/* int lfEsc = */ getshort(handle); // 2 bytes
/* int lfOrient = */ getshort(handle); // 2 bytes
int lfWeight = getshort(handle); // 2 bytes
char lfItalic = (char)getc(handle); // 1 byte
char lfUnderline = (char)getc(handle); // 1 byte
/* char lfStrikeout = */ getc(handle); // 1 byte
/* char lfCharSet = */ getc(handle); // 1 byte
/* char lfOutPrecision = */ getc(handle); // 1 byte
/* char lfClipPrecision = */ getc(handle); // 1 byte
/* char lfQuality = */ getc(handle); // 1 byte
char lfPitchAndFamily = (char)getc(handle); // 1 byte (18th)
char lfFacename[32];
// Read the rest of the record, which is total record size
// minus the number of bytes already read (18 record, 6 metarecord
// header)
fread((void *)lfFacename, sizeof(char), (int)((2*rdSize) - 18 - 6), handle);
int family;
if (lfPitchAndFamily & FF_MODERN)
family = wxMODERN;
else if (lfPitchAndFamily & FF_MODERN)
family = wxMODERN;
else if (lfPitchAndFamily & FF_ROMAN)
family = wxROMAN;
else if (lfPitchAndFamily & FF_SWISS)
family = wxSWISS;
else if (lfPitchAndFamily & FF_DECORATIVE)
family = wxDECORATIVE;
else
family = wxDEFAULT;
int weight;
if (lfWeight == 300)
weight = wxLIGHT;
else if (lfWeight == 400)
weight = wxNORMAL;
else if (lfWeight == 900)
weight = wxBOLD;
else weight = wxNORMAL;
int style;
if (lfItalic != 0)
style = wxITALIC;
else
style = wxNORMAL;
// About how many pixels per inch???
int logPixelsY = 100;
int pointSize = (int)(lfHeight*72.0/logPixelsY);
wxFont *theFont =
wxTheFontList->FindOrCreateFont(pointSize, family, style, weight, (lfUnderline != 0));
rec->param1 = (long) theFont;
metaRecords.Append(rec);
gdiObjects.Append(rec);
AddMetaRecordHandle(rec);
rec->param2 = (long)(gdiObjects.GetCount() - 1);
break;
}
case META_CREATEBRUSHINDIRECT:
{
wxMetaRecord *rec = new wxMetaRecord(META_CREATEBRUSHINDIRECT);
int msStyle = getshort(handle); // Style: 2 bytes
long colorref = getint(handle); // COLORREF: 4 bytes
int hatchStyle = getshort(handle); // Hatch style 2 bytes
int style;
switch (msStyle)
{
case BS_HATCHED:
{
switch (hatchStyle)
{
case HS_BDIAGONAL:
style = wxBDIAGONAL_HATCH;
break;
case HS_DIAGCROSS:
style = wxCROSSDIAG_HATCH;
break;
case HS_FDIAGONAL:
style = wxFDIAGONAL_HATCH;
break;
case HS_HORIZONTAL:
style = wxHORIZONTAL_HATCH;
break;
case HS_VERTICAL:
style = wxVERTICAL_HATCH;
break;
default:
case HS_CROSS:
style = wxCROSS_HATCH;
break;
}
break;
}
#if PS_DOT != BS_HATCHED
/* ABX 30.12.2003 */
/* in microsoft/include/wingdi.h both are the same */
/* in fact I'm not sure why pen related PS_XXX and */
/* BS_XXX constants are all mixed into single style */
case PS_DOT:
style = wxDOT;
break;
#endif
case PS_DASH:
style = wxSHORT_DASH;
break;
case PS_NULL:
style = wxTRANSPARENT;
break;
case BS_SOLID:
default:
style = wxSOLID;
break;
}
wxColour colour(GetRValue(colorref), GetGValue(colorref), GetBValue(colorref));
rec->param1 = (long)wxTheBrushList->FindOrCreateBrush(colour, style);
metaRecords.Append(rec);
gdiObjects.Append(rec);
AddMetaRecordHandle(rec);
rec->param2 = (long)(gdiObjects.GetCount() - 1);
break;
}
case META_CREATEBITMAPINDIRECT:
{
wxMetaRecord *rec = new wxMetaRecord(META_CREATEBITMAPINDIRECT);
fread((void *)_buf, sizeof(char), (int)((2*rdSize) - 6), handle);
metaRecords.Append(rec);
gdiObjects.Append(rec);
AddMetaRecordHandle(rec);
rec->param2 = (long)(gdiObjects.GetCount() - 1);
break;
}
case META_CREATEBITMAP:
{
wxMetaRecord *rec = new wxMetaRecord(META_CREATEBITMAP);
fread((void *)_buf, sizeof(char), (int)((2*rdSize) - 6), handle);
metaRecords.Append(rec);
gdiObjects.Append(rec);
AddMetaRecordHandle(rec);
rec->param2 = (long)(gdiObjects.GetCount() - 1);
break;
}
case META_CREATEREGION:
{
wxMetaRecord *rec = new wxMetaRecord(META_CREATEREGION);
fread((void *)_buf, sizeof(char), (int)((2*rdSize) - 6), handle);
metaRecords.Append(rec);
gdiObjects.Append(rec);
AddMetaRecordHandle(rec);
rec->param2 = (long)(gdiObjects.GetCount() - 1);
break;
}
default:
{
fread((void *)_buf, sizeof(char), (int)((2*rdSize) - 6), handle);
break;
}
}
}
fclose(handle);
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -