📄 drawn.cpp
字号:
dc.SetTextForeground(col);
break;
}
case DRAWOP_SET_BK_COLOUR:
{
wxColour col(m_r,m_g,m_b);
dc.SetTextBackground(col);
break;
}
case DRAWOP_SET_BK_MODE:
{
dc.SetBackgroundMode(m_mode);
break;
}
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_PROLOGIO
wxExpr *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_PROLOGIO
wxExpr *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_PROLOGIO
wxExpr *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:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -