⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basic2.cpp

📁 wxGTK 是 wxWidgets 的 linux GTK+ (>2.2.3)版本。wxWidgets 是一个跨平台的 GUI 框架
💻 CPP
📖 第 1 页 / 共 4 页
字号:
  // In case we're reading an old file, set the region's size  if (m_regions.GetCount() == 1)  {    wxShapeRegion *region = (wxShapeRegion *)m_regions.GetFirst()->GetData();    region->SetSize(m_width, m_height);  }}#endifvoid wxRectangleShape::Copy(wxShape& copy){  wxShape::Copy(copy);  wxASSERT( copy.IsKindOf(CLASSINFO(wxRectangleShape)) );  wxRectangleShape& rectCopy = (wxRectangleShape&) copy;  rectCopy.m_width = m_width;  rectCopy.m_height = m_height;  rectCopy.m_cornerRadius = m_cornerRadius;}int wxRectangleShape::GetNumberOfAttachments() const{  return wxShape::GetNumberOfAttachments();}// There are 4 attachment points on a rectangle - 0 = top, 1 = right, 2 = bottom,// 3 = left.bool wxRectangleShape::GetAttachmentPosition(int attachment, double *x, double *y,                                         int nth, int no_arcs, wxLineShape *line){    return wxShape::GetAttachmentPosition(attachment, x, y, nth, no_arcs, line);}// Text object (no box)IMPLEMENT_DYNAMIC_CLASS(wxTextShape, wxRectangleShape)wxTextShape::wxTextShape(double width, double height):  wxRectangleShape(width, height){}void wxTextShape::OnDraw(wxDC& WXUNUSED(dc)){}void wxTextShape::Copy(wxShape& copy){  wxRectangleShape::Copy(copy);}#if wxUSE_PROLOGIOvoid wxTextShape::WriteAttributes(wxExpr *clause){  wxRectangleShape::WriteAttributes(clause);}#endif// Ellipse objectIMPLEMENT_DYNAMIC_CLASS(wxEllipseShape, wxShape)wxEllipseShape::wxEllipseShape(double w, double h){  m_width = w; m_height = h;  SetDefaultRegionSize();}void wxEllipseShape::GetBoundingBoxMin(double *w, double *h){  *w = m_width; *h = m_height;}bool wxEllipseShape::GetPerimeterPoint(double x1, double y1,                                      double x2, double y2,                                      double *x3, double *y3){  double bound_x, bound_y;  GetBoundingBoxMax(&bound_x, &bound_y);//  oglFindEndForBox(bound_x, bound_y, m_xpos, m_ypos, x2, y2, x3, y3);  oglDrawArcToEllipse(m_xpos, m_ypos, bound_x, bound_y, x2, y2, x1, y1, x3, y3);  return true;}void wxEllipseShape::OnDraw(wxDC& dc){    if (m_shadowMode != SHADOW_NONE)    {      if (m_shadowBrush)        dc.SetBrush(* m_shadowBrush);      dc.SetPen(* g_oglTransparentPen);      dc.DrawEllipse((long) ((m_xpos - GetWidth()/2) + m_shadowOffsetX),                      (long) ((m_ypos - GetHeight()/2) + m_shadowOffsetY),                      (long) GetWidth(), (long) GetHeight());    }    if (m_pen)    {      if (m_pen->GetWidth() == 0)        dc.SetPen(* g_oglTransparentPen);      else        dc.SetPen(* m_pen);    }    if (m_brush)      dc.SetBrush(* m_brush);    dc.DrawEllipse((long) (m_xpos - GetWidth()/2), (long) (m_ypos - GetHeight()/2), (long) GetWidth(), (long) GetHeight());}void wxEllipseShape::SetSize(double x, double y, bool WXUNUSED(recursive)){  SetAttachmentSize(x, y);  m_width = x;  m_height = y;  SetDefaultRegionSize();}#if wxUSE_PROLOGIOvoid wxEllipseShape::WriteAttributes(wxExpr *clause){  wxShape::WriteAttributes(clause);  clause->AddAttributeValue(wxT("x"), m_xpos);  clause->AddAttributeValue(wxT("y"), m_ypos);  clause->AddAttributeValue(wxT("width"), m_width);  clause->AddAttributeValue(wxT("height"), m_height);}void wxEllipseShape::ReadAttributes(wxExpr *clause){  wxShape::ReadAttributes(clause);  clause->AssignAttributeValue(wxT("width"), &m_width);  clause->AssignAttributeValue(wxT("height"), &m_height);  // In case we're reading an old file, set the region's size  if (m_regions.GetCount() == 1)  {    wxShapeRegion *region = (wxShapeRegion *)m_regions.GetFirst()->GetData();    region->SetSize(m_width, m_height);  }}#endifvoid wxEllipseShape::Copy(wxShape& copy){  wxShape::Copy(copy);  wxASSERT( copy.IsKindOf(CLASSINFO(wxEllipseShape)) );  wxEllipseShape& ellipseCopy = (wxEllipseShape&) copy;  ellipseCopy.m_width = m_width;  ellipseCopy.m_height = m_height;}int wxEllipseShape::GetNumberOfAttachments() const{  return wxShape::GetNumberOfAttachments();}// There are 4 attachment points on an ellipse - 0 = top, 1 = right, 2 = bottom,// 3 = left.bool wxEllipseShape::GetAttachmentPosition(int attachment, double *x, double *y,                                         int nth, int no_arcs, wxLineShape *line){  if (m_attachmentMode == ATTACHMENT_MODE_BRANCHING)    return wxShape::GetAttachmentPosition(attachment, x, y, nth, no_arcs, line);  if (m_attachmentMode != ATTACHMENT_MODE_NONE)  {    double top = (double)(m_ypos + m_height/2.0);    double bottom = (double)(m_ypos - m_height/2.0);    double left = (double)(m_xpos - m_width/2.0);    double right = (double)(m_xpos + m_width/2.0);    int physicalAttachment = LogicalToPhysicalAttachment(attachment);    switch (physicalAttachment)    {      case 0:      {        if (m_spaceAttachments)          *x = left + (nth + 1)*m_width/(no_arcs + 1);        else *x = m_xpos;        *y = top;        // We now have the point on the bounding box: but get the point on the ellipse        // by imagining a vertical line from (*x, m_ypos - m_height- 500) to (*x, m_ypos) intersecting        // the ellipse.        oglDrawArcToEllipse(m_xpos, m_ypos, m_width, m_height, *x, (double)(m_ypos-m_height-500), *x, m_ypos, x, y);        break;      }      case 1:      {        *x = right;        if (m_spaceAttachments)          *y = bottom + (nth + 1)*m_height/(no_arcs + 1);        else *y = m_ypos;        oglDrawArcToEllipse(m_xpos, m_ypos, m_width, m_height, (double)(m_xpos+m_width+500), *y, m_xpos, *y, x, y);        break;      }      case 2:      {        if (m_spaceAttachments)          *x = left + (nth + 1)*m_width/(no_arcs + 1);        else *x = m_xpos;        *y = bottom;        oglDrawArcToEllipse(m_xpos, m_ypos, m_width, m_height, *x, (double)(m_ypos+m_height+500), *x, m_ypos, x, y);        break;      }      case 3:      {        *x = left;        if (m_spaceAttachments)          *y = bottom + (nth + 1)*m_height/(no_arcs + 1);        else *y = m_ypos;        oglDrawArcToEllipse(m_xpos, m_ypos, m_width, m_height, (double)(m_xpos-m_width-500), *y, m_xpos, *y, x, y);        break;      }      default:      {        return wxShape::GetAttachmentPosition(attachment, x, y, nth, no_arcs, line);      }    }    return true;  }  else  { *x = m_xpos; *y = m_ypos; return true; }}// Circle objectIMPLEMENT_DYNAMIC_CLASS(wxCircleShape, wxEllipseShape)wxCircleShape::wxCircleShape(double diameter):wxEllipseShape(diameter, diameter){    SetMaintainAspectRatio(true);}void wxCircleShape::Copy(wxShape& copy){  wxEllipseShape::Copy(copy);}bool wxCircleShape::GetPerimeterPoint(double WXUNUSED(x1), double WXUNUSED(y1),                                      double x2, double y2,                                      double *x3, double *y3){  oglFindEndForCircle(m_width/2,                      m_xpos, m_ypos,  // Centre of circle                      x2, y2,  // Other end of line                      x3, y3);  return true;}// Control pointsdouble wxControlPoint::sm_controlPointDragStartX = 0.0;double wxControlPoint::sm_controlPointDragStartY = 0.0;double wxControlPoint::sm_controlPointDragStartWidth = 0.0;double wxControlPoint::sm_controlPointDragStartHeight = 0.0;double wxControlPoint::sm_controlPointDragEndWidth = 0.0;double wxControlPoint::sm_controlPointDragEndHeight = 0.0;double wxControlPoint::sm_controlPointDragPosX = 0.0;double wxControlPoint::sm_controlPointDragPosY = 0.0;IMPLEMENT_DYNAMIC_CLASS(wxControlPoint, wxRectangleShape)wxControlPoint::wxControlPoint(wxShapeCanvas *theCanvas, wxShape *object, double size, double the_xoffset, double the_yoffset, int the_type):wxRectangleShape(size, size){  m_canvas = theCanvas;  m_shape = object;  m_xoffset = the_xoffset;  m_yoffset = the_yoffset;  m_type = the_type;  SetPen(g_oglBlackForegroundPen);  SetBrush(wxBLACK_BRUSH);  m_oldCursor = NULL;  m_visible = true;  m_eraseObject = true;}wxControlPoint::~wxControlPoint(){}// Don't even attempt to draw any text - waste of time!void wxControlPoint::OnDrawContents(wxDC& WXUNUSED(dc)){}void wxControlPoint::OnDraw(wxDC& dc){  m_xpos = m_shape->GetX() + m_xoffset;  m_ypos = m_shape->GetY() + m_yoffset;  wxRectangleShape::OnDraw(dc);}void wxControlPoint::OnErase(wxDC& dc){  wxRectangleShape::OnErase(dc);}// Implement resizing of canvas objectvoid wxControlPoint::OnDragLeft(bool draw, double x, double y, int keys, int attachment){    m_shape->GetEventHandler()->OnSizingDragLeft(this, draw, x, y, keys, attachment);}void wxControlPoint::OnBeginDragLeft(double x, double y, int keys, int attachment){    m_shape->GetEventHandler()->OnSizingBeginDragLeft(this, x, y, keys, attachment);}void wxControlPoint::OnEndDragLeft(double x, double y, int keys, int attachment){    m_shape->GetEventHandler()->OnSizingEndDragLeft(this, x, y, keys, attachment);}int wxControlPoint::GetNumberOfAttachments() const{  return 1;}bool wxControlPoint::GetAttachmentPosition(int WXUNUSED(attachment), double *x, double *y,                                         int WXUNUSED(nth), int WXUNUSED(no_arcs), wxLineShape *WXUNUSED(line)){  *x = m_xpos; *y = m_ypos;  return true;}// Control points ('handles') redirect control to the actual shape, to make it easier// to override sizing behaviour.void wxShape::OnSizingDragLeft(wxControlPoint* pt, bool WXUNUSED(draw), double x, double y, int keys, int WXUNUSED(attachment)){  double bound_x;  double bound_y;  this->GetBoundingBoxMin(&bound_x, &bound_y);  wxClientDC dc(GetCanvas());  GetCanvas()->PrepareDC(dc);  dc.SetLogicalFunction(OGLRBLF);  wxPen dottedPen(*wxBLACK, 1, wxDOT);  dc.SetPen(dottedPen);  dc.SetBrush((* wxTRANSPARENT_BRUSH));  if (this->GetCentreResize())  {    // Maintain the same centre point.    double new_width = (double)(2.0*fabs(x - this->GetX()));    double new_height = (double)(2.0*fabs(y - this->GetY()));    // Constrain sizing according to what control point you're dragging    if (pt->m_type == CONTROL_POINT_HORIZONTAL)    {        if (GetMaintainAspectRatio())        {            new_height = bound_y*(new_width/bound_x);        }        else            new_height = bound_y;    }    else if (pt->m_type == CONTROL_POINT_VERTICAL)    {        if (GetMaintainAspectRatio())        {            new_width = bound_x*(new_height/bound_y);        }        else            new_width = bound_x;    }    else if (pt->m_type == CONTROL_POINT_DIAGONAL && (keys & KEY_SHIFT))      new_height = bound_y*(new_width/bound_x);    if (this->GetFixedWidth())      new_width = bound_x;    if (this->GetFixedHeight())      new_height = bound_y;    pt->sm_controlPointDragEndWidth = new_width;    pt->sm_controlPointDragEndHeight = new_height;    this->GetEventHandler()->OnDrawOutline(dc, this->GetX(), this->GetY(),                                new_width, new_height);  }  else  {    // Don't maintain the same centre point!    double newX1 = wxMin(pt->sm_controlPointDragStartX, x);    double newY1 = wxMin(pt->sm_controlPointDragStartY, y);    double newX2 = wxMax(pt->sm_controlPointDragStartX, x);    double newY2 = wxMax(pt->sm_controlPointDragStartY, y);    if (pt->m_type == CONTROL_POINT_HORIZONTAL)    {      newY1 = pt->sm_controlPointDragStartY;      newY2 = newY1 + pt->sm_controlPointDragStartHeight;    }    else if (pt->m_type == CONTROL_POINT_VERTICAL)    {      newX1 = pt->sm_controlPointDragStartX;      newX2 = newX1 + pt->sm_controlPointDragStartWidth;    }    else if (pt->m_type == CONTROL_POINT_DIAGONAL && ((keys & KEY_SHIFT) || GetMaintainAspectRatio()))    {      double newH = (double)((newX2 - newX1)*(pt->sm_controlPointDragStartHeight/pt->sm_controlPointDragStartWidth));      if (GetY() > pt->sm_controlPointDragStartY)        newY2 = (double)(newY1 + newH);      else        newY1 = (double)(newY2 - newH);    }    double newWidth = (double)(newX2 - newX1);    double newHeight = (double)(newY2 - newY1);    if (pt->m_type == CONTROL_POINT_VERTICAL && GetMaintainAspectRatio())    {        newWidth = bound_x * (newHeight/bound_y) ;    }    if (pt->m_type == CONTROL_POINT_HORIZONTAL && GetMaintainAspectRatio())    {        newHeight = bound_y * (newWidth/bound_x) ;    }    pt->sm_controlPointDragPosX = (double)(newX1 + (newWidth/2.0));    pt->sm_controlPointDragPosY = (double)(newY1 + (newHeight/2.0));    if (this->GetFixedWidth())      newWidth = bound_x;    if (this->GetFixedHeight())      newHeight = bound_y;    pt->sm_controlPointDragEndWidth = newWidth;    pt->sm_controlPointDragEndHeight = newHeight;    this->GetEventHandler()->OnDrawOutline(dc, pt->sm_controlPointDragPosX, pt->sm_controlPointDragPosY, newWidth, newHeight);  }}void wxShape::OnSizingBeginDragLeft(wxControlPoint* pt, double x, double y, int keys, int WXUNUSED(attachment)){  m_canvas->CaptureMouse();  wxClientDC dc(GetCanvas());  GetCanvas()->PrepareDC(dc);/*  if (pt->m_eraseObject)    this->Erase(dc);*/  dc.SetLogicalFunction(OGLRBLF);  double bound_x;  double bound_y;  this->GetBoundingBoxMin(&bound_x, &bound_y);  this->GetEventHandler()->OnBeginSize(bound_x, bound_y);  // Choose the 'opposite corner' of the object as the stationary  // point in case this is non-centring resizing.  if (pt->GetX() < this->GetX())    pt->sm_controlPointDragStartX = (double)(this->GetX() + (bound_x/2.0));  else    pt->sm_controlPointDragStartX = (double)(this->GetX() - (bound_x/2.0));  if (pt->GetY() < this->GetY())    pt->sm_controlPointDragStartY = (double)(this->GetY() + (bound_y/2.0));  else    pt->sm_controlPointDragStartY = (double)(this->GetY() - (bound_y/2.0));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -