📄 drawn.cpp
字号:
default: break; }}wxDrawOp *wxOpSetGDI::Copy(wxPseudoMetaFile *newImage){ wxOpSetGDI *newOp = new wxOpSetGDI(m_op, newImage, m_gdiIndex, m_mode); newOp->m_r = m_r; newOp->m_g = m_g; newOp->m_b = m_b; return newOp;}#if wxUSE_PROLOGIOwxExpr *wxOpSetGDI::WriteExpr(wxPseudoMetaFile *WXUNUSED(image)){ wxExpr *expr = new wxExpr(wxExprList); expr->Append(new wxExpr((long)m_op)); switch (m_op) { case DRAWOP_SET_PEN: case DRAWOP_SET_BRUSH: case DRAWOP_SET_FONT: { expr->Append(new wxExpr((long)m_gdiIndex)); break; } case DRAWOP_SET_TEXT_COLOUR: case DRAWOP_SET_BK_COLOUR: { expr->Append(new wxExpr((long)m_r)); expr->Append(new wxExpr((long)m_g)); expr->Append(new wxExpr((long)m_b)); break; } case DRAWOP_SET_BK_MODE: { expr->Append(new wxExpr((long)m_mode)); break; } default: break; } return expr;}void wxOpSetGDI::ReadExpr(wxPseudoMetaFile *WXUNUSED(image), wxExpr *expr){ switch (m_op) { case DRAWOP_SET_PEN: case DRAWOP_SET_BRUSH: case DRAWOP_SET_FONT: { m_gdiIndex = (int)expr->Nth(1)->IntegerValue(); break; } case DRAWOP_SET_TEXT_COLOUR: case DRAWOP_SET_BK_COLOUR: { m_r = (unsigned char)expr->Nth(1)->IntegerValue(); m_g = (unsigned char)expr->Nth(2)->IntegerValue(); m_b = (unsigned char)expr->Nth(3)->IntegerValue(); break; } case DRAWOP_SET_BK_MODE: { m_mode = (int)expr->Nth(1)->IntegerValue(); break; } default: break; }}#endif/* * Set/destroy clipping * */wxOpSetClipping::wxOpSetClipping(int theOp, double theX1, double theY1, double theX2, double theY2):wxDrawOp(theOp){ m_x1 = theX1; m_y1 = theY1; m_x2 = theX2; m_y2 = theY2;}wxDrawOp *wxOpSetClipping::Copy(wxPseudoMetaFile *WXUNUSED(newImage)){ wxOpSetClipping *newOp = new wxOpSetClipping(m_op, m_x1, m_y1, m_x2, m_y2); return newOp;}void wxOpSetClipping::Do(wxDC& dc, double xoffset, double yoffset){ switch (m_op) { case DRAWOP_SET_CLIPPING_RECT: { dc.SetClippingRegion((long)(m_x1 + xoffset), (long)(m_y1 + yoffset), (long)(m_x2 + xoffset), (long)(m_y2 + yoffset)); break; } case DRAWOP_DESTROY_CLIPPING_RECT: { dc.DestroyClippingRegion(); break; } default: break; }}void wxOpSetClipping::Scale(double xScale, double yScale){ m_x1 *= xScale; m_y1 *= yScale; m_x2 *= xScale; m_y2 *= yScale;}void wxOpSetClipping::Translate(double x, double y){ m_x1 += x; m_y1 += y;}#if wxUSE_PROLOGIOwxExpr *wxOpSetClipping::WriteExpr(wxPseudoMetaFile *WXUNUSED(image)){ wxExpr *expr = new wxExpr(wxExprList); expr->Append(new wxExpr((long)m_op)); switch (m_op) { case DRAWOP_SET_CLIPPING_RECT: { expr->Append(new wxExpr(m_x1)); expr->Append(new wxExpr(m_y1)); expr->Append(new wxExpr(m_x2)); expr->Append(new wxExpr(m_y2)); break; } default: break; } return expr;}void wxOpSetClipping::ReadExpr(wxPseudoMetaFile *WXUNUSED(image), wxExpr *expr){ switch (m_op) { case DRAWOP_SET_CLIPPING_RECT: { m_x1 = expr->Nth(1)->RealValue(); m_y1 = expr->Nth(2)->RealValue(); m_x2 = expr->Nth(3)->RealValue(); m_y2 = expr->Nth(4)->RealValue(); break; } default: break; }}#endif/* * Draw line, rectangle, rounded rectangle, ellipse, point, arc, text * */wxOpDraw::wxOpDraw(int theOp, double theX1, double theY1, double theX2, double theY2, double theRadius, const wxString& s) : wxDrawOp(theOp){ m_x1 = theX1; m_y1 = theY1; m_x2 = theX2; m_y2 = theY2; m_x3 = 0.0; m_y3 = 0.0; m_radius = theRadius; m_textString = s;}wxOpDraw::~wxOpDraw(){}wxDrawOp *wxOpDraw::Copy(wxPseudoMetaFile *WXUNUSED(newImage)){ wxOpDraw *newOp = new wxOpDraw(m_op, m_x1, m_y1, m_x2, m_y2, m_radius, m_textString); newOp->m_x3 = m_x3; newOp->m_y3 = m_y3; return newOp;}void wxOpDraw::Do(wxDC& dc, double xoffset, double yoffset){ switch (m_op) { case DRAWOP_DRAW_LINE: { dc.DrawLine(WXROUND(m_x1+xoffset), WXROUND(m_y1+yoffset), WXROUND(m_x2+xoffset), WXROUND(m_y2+yoffset)); break; } case DRAWOP_DRAW_RECT: { dc.DrawRectangle(WXROUND(m_x1+xoffset), WXROUND(m_y1+yoffset), WXROUND(m_x2), WXROUND(m_y2)); break; } case DRAWOP_DRAW_ROUNDED_RECT: { dc.DrawRoundedRectangle(WXROUND(m_x1+xoffset), WXROUND(m_y1+yoffset), WXROUND(m_x2), WXROUND(m_y2), m_radius); break; } case DRAWOP_DRAW_ELLIPSE: { dc.DrawEllipse(WXROUND(m_x1+xoffset), WXROUND(m_y1+yoffset), WXROUND(m_x2), WXROUND(m_y2)); break; } case DRAWOP_DRAW_ARC: { dc.DrawArc(WXROUND(m_x2+xoffset), WXROUND(m_y2+yoffset), WXROUND(m_x3+xoffset), WXROUND(m_y3+yoffset), WXROUND(m_x1+xoffset), WXROUND(m_y1+yoffset)); break; } case DRAWOP_DRAW_ELLIPTIC_ARC: { const double pi = M_PI ; // Convert back to degrees dc.DrawEllipticArc( WXROUND(m_x1+xoffset), WXROUND(m_y1+yoffset), WXROUND(m_x2), WXROUND(m_y2), WXROUND(m_x3*(360.0/(2.0*pi))), WXROUND(m_y3*(360.0/(2.0*pi)))); break; } case DRAWOP_DRAW_POINT: { dc.DrawPoint(WXROUND(m_x1+xoffset), WXROUND(m_y1+yoffset)); break; } case DRAWOP_DRAW_TEXT: { dc.DrawText(m_textString, WXROUND(m_x1+xoffset), WXROUND(m_y1+yoffset)); break; } default: break; }}void wxOpDraw::Scale(double scaleX, double scaleY){ m_x1 *= scaleX; m_y1 *= scaleY; m_x2 *= scaleX; m_y2 *= scaleY; if (m_op != DRAWOP_DRAW_ELLIPTIC_ARC) { m_x3 *= scaleX; m_y3 *= scaleY; } m_radius *= scaleX;}void wxOpDraw::Translate(double x, double y){ m_x1 += x; m_y1 += y; switch (m_op) { case DRAWOP_DRAW_LINE: { m_x2 += x; m_y2 += y; break; } case DRAWOP_DRAW_ARC: { m_x2 += x; m_y2 += y; m_x3 += x; m_y3 += y; break; } case DRAWOP_DRAW_ELLIPTIC_ARC: { break; } default: break; }}void wxOpDraw::Rotate(double x, double y, double theta, double sinTheta, double cosTheta){ double newX1 = m_x1*cosTheta - m_y1*sinTheta + x*(1.0 - cosTheta) + y*sinTheta; double newY1 = m_x1*sinTheta + m_y1*cosTheta + y*(1.0 - cosTheta) + x*sinTheta; switch (m_op) { case DRAWOP_DRAW_LINE: { double newX2 = m_x2*cosTheta - m_y2*sinTheta + x*(1.0 - cosTheta) + y*sinTheta; double newY2 = m_x2*sinTheta + m_y2*cosTheta + y*(1.0 - cosTheta) + x*sinTheta; m_x1 = newX1; m_y1 = newY1; m_x2 = newX2; m_y2 = newY2; break; } case DRAWOP_DRAW_RECT: case DRAWOP_DRAW_ROUNDED_RECT: case DRAWOP_DRAW_ELLIPTIC_ARC: { // Assume only 0, 90, 180, 270 degree rotations. // oldX1, oldY1 represents the top left corner. Find the // bottom right, and rotate that. Then the width/height is the difference // between x/y values. double oldBottomRightX = m_x1 + m_x2; double oldBottomRightY = m_y1 + m_y2; double newBottomRightX = oldBottomRightX*cosTheta - oldBottomRightY*sinTheta + x*(1.0 - cosTheta) + y*sinTheta; double newBottomRightY = oldBottomRightX*sinTheta + oldBottomRightY*cosTheta + y*(1.0 - cosTheta) + x*sinTheta; // Now find the new top-left, bottom-right coordinates. double minX = wxMin(newX1, newBottomRightX); double minY = wxMin(newY1, newBottomRightY); double maxX = wxMax(newX1, newBottomRightX); double maxY = wxMax(newY1, newBottomRightY); m_x1 = minX; m_y1 = minY; m_x2 = maxX - minX; // width m_y2 = maxY - minY; // height if (m_op == DRAWOP_DRAW_ELLIPTIC_ARC) { // Add rotation to angles m_x3 += theta; m_y3 += theta; } break; } case DRAWOP_DRAW_ARC: { double newX2 = m_x2*cosTheta - m_y2*sinTheta + x*(1.0 - cosTheta) + y*sinTheta; double newY2 = m_x2*sinTheta + m_y2*cosTheta + y*(1.0 - cosTheta) + x*sinTheta; double newX3 = m_x3*cosTheta - m_y3*sinTheta + x*(1.0 - cosTheta) + y*sinTheta; double newY3 = m_x3*sinTheta + m_y3*cosTheta + y*(1.0 - cosTheta) + x*sinTheta; m_x1 = newX1; m_y1 = newY1; m_x2 = newX2; m_y2 = newY2; m_x3 = newX3; m_y3 = newY3; break; } default: break; }}#if wxUSE_PROLOGIOwxExpr *wxOpDraw::WriteExpr(wxPseudoMetaFile *WXUNUSED(image)){ wxExpr *expr = new wxExpr(wxExprList); expr->Append(new wxExpr((long)m_op)); switch (m_op) { case DRAWOP_DRAW_LINE: case DRAWOP_DRAW_RECT: case DRAWOP_DRAW_ELLIPSE: { expr->Append(new wxExpr(m_x1)); expr->Append(new wxExpr(m_y1)); expr->Append(new wxExpr(m_x2)); expr->Append(new wxExpr(m_y2)); break; } case DRAWOP_DRAW_ROUNDED_RECT: { expr->Append(new wxExpr(m_x1)); expr->Append(new wxExpr(m_y1)); expr->Append(new wxExpr(m_x2)); expr->Append(new wxExpr(m_y2)); expr->Append(new wxExpr(m_radius)); break; } case DRAWOP_DRAW_POINT: { expr->Append(new wxExpr(m_x1)); expr->Append(new wxExpr(m_y1)); break; } case DRAWOP_DRAW_TEXT: { expr->Append(new wxExpr(m_x1)); expr->Append(new wxExpr(m_y1)); expr->Append(new wxExpr(wxExprString, m_textString)); break; } case DRAWOP_DRAW_ARC: case DRAWOP_DRAW_ELLIPTIC_ARC: { expr->Append(new wxExpr(m_x1)); expr->Append(new wxExpr(m_y1)); expr->Append(new wxExpr(m_x2)); expr->Append(new wxExpr(m_y2)); expr->Append(new wxExpr(m_x3)); expr->Append(new wxExpr(m_y3)); break; } default: { break; } } return expr;}void wxOpDraw::ReadExpr(wxPseudoMetaFile *WXUNUSED(image), wxExpr *expr){ switch (m_op) { case DRAWOP_DRAW_LINE: case DRAWOP_DRAW_RECT: case DRAWOP_DRAW_ELLIPSE: { m_x1 = expr->Nth(1)->RealValue(); m_y1 = expr->Nth(2)->RealValue(); m_x2 = expr->Nth(3)->RealValue(); m_y2 = expr->Nth(4)->RealValue(); break; } case DRAWOP_DRAW_ROUNDED_RECT: { m_x1 = expr->Nth(1)->RealValue(); m_y1 = expr->Nth(2)->RealValue(); m_x2 = expr->Nth(3)->RealValue(); m_y2 = expr->Nth(4)->RealValue(); m_radius = expr->Nth(5)->RealValue(); break; } case DRAWOP_DRAW_POINT: { m_x1 = expr->Nth(1)->RealValue(); m_y1 = expr->Nth(2)->RealValue(); break; } case DRAWOP_DRAW_TEXT: { m_x1 = expr->Nth(1)->RealValue(); m_y1 = expr->Nth(2)->RealValue(); m_textString = wxString(expr->Nth(3)->StringValue()); break; } case DRAWOP_DRAW_ARC: case DRAWOP_DRAW_ELLIPTIC_ARC: { m_x1 = expr->Nth(1)->RealValue(); m_y1 = expr->Nth(2)->RealValue(); m_x2 = expr->Nth(3)->RealValue(); m_y2 = expr->Nth(4)->RealValue(); m_x3 = expr->Nth(5)->RealValue(); m_y3 = expr->Nth(6)->RealValue(); break; } default: { break; } }}#endif/* * Draw polygon, polyline, spline * */wxOpPolyDraw::wxOpPolyDraw(int theOp, int n, wxRealPoint *thePoints):wxDrawOp(theOp){ m_noPoints = n; m_points = thePoints;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -