📄 drawn.cpp
字号:
}// 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: { // The pen, brush etc. has already been created when the metafile // was read in, so we don't create it - we set it. wxNode *recNode = metaFile->gdiObjects.Item((int)record->param2); if (recNode) { wxMetaRecord *gdiRec = (wxMetaRecord *)recNode->GetData(); if (gdiRec && (gdiRec->param1 != 0)) { wxObject *obj = (wxObject *)gdiRec->param1; if (obj->IsKindOf(CLASSINFO(wxPen))) { wxOpSetGDI *op = new wxOpSetGDI(DRAWOP_SET_PEN, this, (int)record->param2); m_ops.Append(op); } else if (obj->IsKindOf(CLASSINFO(wxBrush))) { wxOpSetGDI *op = new wxOpSetGDI(DRAWOP_SET_BRUSH, this, (int)record->param2); m_ops.Append(op); } else if (obj->IsKindOf(CLASSINFO(wxFont))) { wxOpSetGDI *op = new wxOpSetGDI(DRAWOP_SET_FONT, this, (int)record->param2); m_ops.Append(op); } } } 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: { // Place holder m_gdiObjects.Append(NULL); 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: // DO!! case META_CREATEPALETTE: { // Place holder m_gdiObjects.Append(NULL); break; } case META_CREATEBRUSH: { // Place holder m_gdiObjects.Append(NULL); break; } case META_CREATEPATTERNBRUSH: { // Place holder m_gdiObjects.Append(NULL); break; } case META_CREATEPENINDIRECT: { // The pen is created when the metafile is read in. // We keep track of all the GDI objects needed for this // image so when reading the wxDrawnShape from file, // we can read in all the GDI objects, then refer // to them by an index starting from zero thereafter. m_gdiObjects.Append((wxObject *)record->param1); break; } case META_CREATEFONTINDIRECT: { m_gdiObjects.Append((wxObject *)record->param1); break; } case META_CREATEBRUSHINDIRECT: { // Don't have to do anything here: the pen is created // when the metafile is read in. m_gdiObjects.Append((wxObject *)record->param1); break; } case META_CREATEBITMAPINDIRECT: { // Place holder m_gdiObjects.Append(NULL); break; } case META_CREATEBITMAP: { // Place holder m_gdiObjects.Append(NULL); break; } case META_CREATEREGION: { // Place holder m_gdiObjects.Append(NULL); break; } default: { break; } } node = node->GetNext(); } double actualWidth = (double)fabs(metaFile->right - metaFile->left); double actualHeight = (double)fabs(metaFile->bottom - metaFile->top); double initialScaleX = 1.0; double initialScaleY = 1.0; double xoffset, yoffset; // Translate so origin is at centre of rectangle if (metaFile->bottom > metaFile->top) yoffset = - (double)((metaFile->bottom - metaFile->top)/2.0); else yoffset = - (double)((metaFile->top - metaFile->bottom)/2.0); if (metaFile->right > metaFile->left) xoffset = - (double)((metaFile->right - metaFile->left)/2.0); else xoffset = - (double)((metaFile->left - metaFile->right)/2.0); Translate(xoffset, yoffset); // Scale to a reasonable size (take the width of this wxDrawnShape // as a guide) if (actualWidth != 0.0) { initialScaleX = (double)((*rwidth) / actualWidth); initialScaleY = initialScaleX; (*rheight) = initialScaleY*actualHeight; } Scale(initialScaleX, initialScaleY); m_width = (actualWidth*initialScaleX); m_height = *rheight; delete metaFile; return true;}// Scale to fit sizevoid wxPseudoMetaFile::ScaleTo(double w, double h){ double scaleX = (double)(w/m_width); double scaleY = (double)(h/m_height); // Do the scaling Scale(scaleX, scaleY);}void wxPseudoMetaFile::GetBounds(double *boundMinX, double *boundMinY, double *boundMaxX, double *boundMaxY){ double maxX = (double) -99999.9; double maxY = (double) -99999.9; double minX = (double) 99999.9; double minY = (double) 99999.9; wxNode *node = m_ops.GetFirst(); while (node) { wxDrawOp *op = (wxDrawOp *)node->GetData(); switch (op->GetOp()) { case DRAWOP_DRAW_LINE: case DRAWOP_DRAW_RECT: case DRAWOP_DRAW_ROUNDED_RECT: case DRAWOP_DRAW_ELLIPSE: case DRAWOP_DRAW_ELLIPTIC_ARC: case DRAWOP_DRAW_POINT: case DRAWOP_DRAW_TEXT: { wxOpDraw *opDraw = (wxOpDraw *)op; if (opDraw->m_x1 < minX) minX = opDraw->m_x1; if (opDraw->m_x1 > maxX) maxX = opDraw->m_x1; if (opDraw->m_y1 < minY) minY = opDraw->m_y1; if (opDraw->m_y1 > maxY) maxY = opDraw->m_y1; if (op->GetOp() == DRAWOP_DRAW_LINE) { if (opDraw->m_x2 < minX) minX = opDraw->m_x2; if (opDraw->m_x2 > maxX) maxX = opDraw->m_x2; if (opDraw->m_y2 < minY) minY = opDraw->m_y2; if (opDraw->m_y2 > maxY) maxY = opDraw->m_y2; } else if (op->GetOp() == DRAWOP_DRAW_RECT || op->GetOp() == DRAWOP_DRAW_ROUNDED_RECT || op->GetOp() == DRAWOP_DRAW_ELLIPSE || op->GetOp() == DRAWOP_DRAW_ELLIPTIC_ARC) { if ((opDraw->m_x1 + opDraw->m_x2) < minX) minX = (opDraw->m_x1 + opDraw->m_x2); if ((opDraw->m_x1 + opDraw->m_x2) > maxX) maxX = (opDraw->m_x1 + opDraw->m_x2); if ((opDraw->m_y1 + opDraw->m_y2) < minY) minY = (opDraw->m_y1 + opDraw->m_y2); if ((opDraw->m_y1 + opDraw->m_y2) > maxY) maxY = (opDraw->m_y1 + opDraw->m_y2); } break; } case DRAWOP_DRAW_ARC: { // TODO: don't yet know how to calculate the bounding box // for an arc. So pretend it's a line; to get a correct // bounding box, draw a blank rectangle first, of the correct // size. wxOpDraw *opDraw = (wxOpDraw *)op; if (opDraw->m_x1 < minX) minX = opDraw->m_x1; if (opDraw->m_x1 > maxX) maxX = opDraw->m_x1; if (opDraw->m_y1 < minY) minY = opDraw->m_y1; if (opDraw->m_y1 > maxY) maxY = opDraw->m_y1; if (opDraw->m_x2 < minX) minX = opDraw->m_x2; if (opDraw->m_x2 > maxX) maxX = opDraw->m_x2; if (opDraw->m_y2 < minY) minY = opDraw->m_y2; if (opDraw->m_y2 > maxY) maxY = opDraw->m_y2; break; } case DRAWOP_DRAW_POLYLINE: case DRAWOP_DRAW_POLYGON: case DRAWOP_DRAW_SPLINE: { wxOpPolyDraw *poly = (wxOpPolyDraw *)op; for (int i = 0; i < poly->m_noPoints; i++) { if (poly->m_points[i].x < minX) minX = poly->m_points[i].x; if (poly->m_points[i].x > maxX) maxX = poly->m_points[i].x; if (poly->m_points[i].y < minY) minY = poly->m_points[i].y; if (poly->m_points[i].y > maxY) maxY = poly->m_points[i].y; } break; } default: break; } node = node->GetNext(); } *boundMinX = minX; *boundMinY = minY; *boundMaxX = maxX; *boundMaxY = maxY;/* *w = (double)fabs(maxX - minX); *h = (double)fabs(maxY - minY);*/}// Calculate size from current operationsvoid wxPseudoMetaFile::CalculateSize(wxDrawnShape* shape){ double boundMinX, boundMinY, boundMaxX, boundMaxY; GetBounds(& boundMinX, & boundMinY, & boundMaxX, & boundMaxY); SetSize(boundMaxX - boundMinX, boundMaxY - boundMinY); if (shape) { shape->SetWidth(m_width); shape->SetHeight(m_height); }}// Set of functions for drawing into a pseudo metafile.// They use integers, but doubles are used internally for accuracy// when scaling.void wxPseudoMetaFile::DrawLine(const wxPoint& pt1, const wxPoint& pt2){ wxOpDraw *theOp = new wxOpDraw(DRAWOP_DRAW_LINE, (double) pt1.x, (double) pt1.y, (double) pt2.x, (double) pt2.y); m_ops.Append(theOp);}void wxPseudoMetaFile::DrawRectangle(const wxRect& rect){ wxOpDraw *theOp = new wxOpDraw(DRAWOP_DRAW_RECT, (double) rect.x, (double) rect.y, (double) rect.width, (double) rect.height); m_ops.Append(theOp);}void wxPseudoMetaFile::DrawRoundedRectangle(const wxRect& rect, double radius){ wxOpDraw *theOp = new wxOpDraw(DRAWOP_DRAW_ROUNDED_RECT, (double) rect.x, (double) rect.y, (double) rect.width, (double) rect.height); theOp->m_radius = radius; m_ops.Append(theOp);}void wxPseudoMetaFile::DrawEllipse(const wxRect& rect){ wxOpDraw *theOp = new wxOpDraw(DRAWOP_DRAW_ELLIPSE, (double) rect.x, (double) rect.y, (double) rect.width, (double) rect.height); m_ops.Append(theOp);}void wxPseudoMetaFile::DrawArc(const wxPoint& centrePt, const wxPoint& startPt, const wxPoint& endPt){ wxOpDraw *theOp = new wxOpDraw(DRAWOP_DRAW_ARC, (double) centrePt.x, (double) centrePt.y, (double) startPt.x, (double) startPt.y); theOp->m_x3 = (double) endPt.x; theOp->m_y3 = (double) endPt.y; m_ops.Append(theOp);}void wxPseudoMetaFile::DrawEllipticArc(const wxRect& rect, double startAngle, double endAngle){ const double pi = M_PI ; double startAngleRadians = startAngle* (pi*2.0/360.0); double endAngleRadians = endAngle* (pi*2.0/360.0); wxOpDraw *theOp = new wxOpDraw(DRAWOP_DRAW_ELLIPTIC_ARC, (double) rect.x, (double) rect.y, (double) rect.width, (double) rect.height); theOp->m_x3 = startAngleRadians; theOp->m_y3 = endAngleRadians; m_ops.Append(theOp);}void wxPseudoMetaFile::DrawPoint(const wxPoint& pt){ wxOpDraw *theOp = new wxOpDraw(DRAWOP_DRAW_POINT, (double) pt.x, (double) pt.y, 0.0, 0.0); m_ops.Append(theOp);}void wxPseudoMetaFile::DrawText(const wxString& text, const wxPoint& pt){ wxOpDraw *theOp = new wxOpDraw(DRAWOP_DRAW_TEXT, (double) pt.x, (double) pt.y, 0.0, 0.0); theOp->m_textString = text; m_ops.Append(theOp);}void wxPseudoMetaFile::DrawLines(int n, wxPoint pts[]){ wxRealPoint* realPoints = new wxRealPoint[n]; int i; for (i = 0; i < n; i++) { realPoints[i].x = pts[i].x; realPoints[i].y = pts[i].y; } wxOpPolyDraw* theOp = new wxOpPolyDraw(DRAWOP_DRAW_POLYLINE, n, realPoints); m_ops.Append(theOp);}void wxPseudoMetaFile::DrawPolygon(int n, wxPoint pts[], int flags){ wxRealPoint* realPoints = new wxRealPoint[n]; int i; for (i = 0; i < n; i++) { realPoints[i].x = pts[i].x; realPoints[i].y = pts[i].y; } wxOpPolyDraw* theOp = new wxOpPolyDraw(DRAWOP_DRAW_POLYGON, n, realPoints); m_ops.Append(theOp); if (flags & oglMETAFLAGS_OUTLINE) m_outlineOp = (m_ops.GetCount() - 1);}void wxPseudoMetaFile::DrawSpline(int n, wxPoint pts[]){ wxRealPoint* realPoints = new wxRealPoint[n]; int i; for (i = 0; i < n; i++) { realPoints[i].x = pts[i].x; realPoints[i].y = pts[i].y; } wxOpPolyDraw* theOp = new wxOpPolyDraw(DRAWOP_DRAW_SPLINE, n, realPoints); m_ops.Append(theOp);}void wxPseudoMetaFile::SetClippingRect(const wxRect& rect){ /* wxOpSetClipping* theOp = */ new wxOpSetClipping(DRAWOP_SET_CLIPPING_RECT, (double) rect.x, (double) rect.y, (double) rect.width, (double) rect.height);}void wxPseudoMetaFile::DestroyClippingRect(){ wxOpSetClipping* theOp = new wxOpSetClipping(DRAWOP_DESTROY_CLIPPING_RECT, 0.0, 0.0, 0.0, 0.0); m_ops.Append(theOp);}void wxPseudoMetaFile::SetPen(const wxPen* pen, bool isOutline){ m_gdiObjects.Append(wx_const_cast(wxPen*, pen)); int n = m_gdiObjects.GetCount(); wxOpSetGDI* theOp = new wxOpSetGDI(DRAWOP_SET_PEN, this, n - 1); m_ops.Append(theOp); if (isOutline) { m_outlineColours.Append((wxObject*) (n - 1)); }}void wxPseudoMetaFile::SetBrush(const wxBrush* brush, bool isFill){ m_gdiObjects.Append(wx_const_cast(wxBrush*, brush)); int n = m_gdiObjects.GetCount(); wxOpSetGDI* theOp = new wxOpSetGDI(DRAWOP_SET_BRUSH, this, n - 1); m_ops.Append(theOp); if (isFill) { m_fillColours.Append((wxObject*) (n - 1)); }}void wxPseudoMetaFile::SetFont(wxFont* font){ m_gdiObjects.Append(font); int n = m_gdiObjects.GetCount(); wxOpSetGDI* theOp = new wxOpSetGDI(DRAWOP_SET_FONT, this, n - 1); m_ops.Append(theOp);}void wxPseudoMetaFile::SetTextColour(const wxColour& colour){ wxOpSetGDI* theOp = new wxOpSetGDI(DRAWOP_SET_TEXT_COLOUR, this, 0); theOp->m_r = colour.Red(); theOp->m_g = colour.Green(); theOp->m_b = colour.Blue(); m_ops.Append(theOp);}void wxPseudoMetaFile::SetBackgroundColour(const wxColour& colour){ wxOpSetGDI* theOp = new wxOpSetGDI(DRAWOP_SET_BK_COLOUR, this, 0); theOp->m_r = colour.Red(); theOp->m_g = colour.Green(); theOp->m_b = colour.Blue(); m_ops.Append(theOp);}void wxPseudoMetaFile::SetBackgroundMode(int mode){ wxOpSetGDI* theOp = new wxOpSetGDI(DRAWOP_SET_BK_MODE, this, 0, mode); m_ops.Append(theOp);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -