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

📄 basic2.cpp

📁 Wxpython Implemented on Windows CE, Source code
💻 CPP
📖 第 1 页 / 共 4 页
字号:
  if (pt->m_type == CONTROL_POINT_HORIZONTAL)
    pt->sm_controlPointDragStartY = (double)(this->GetY() - (bound_y/2.0));
  else if (pt->m_type == CONTROL_POINT_VERTICAL)
    pt->sm_controlPointDragStartX = (double)(this->GetX() - (bound_x/2.0));

  // We may require the old width and height.
  pt->sm_controlPointDragStartWidth = bound_x;
  pt->sm_controlPointDragStartHeight = bound_y;

  wxPen dottedPen(*wxBLACK, 1, wxDOT);
  dc.SetPen(dottedPen);
  dc.SetBrush((* wxTRANSPARENT_BRUSH));

  if (this->GetCentreResize())
  {
    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 (pt->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::OnSizingEndDragLeft(wxControlPoint* pt, double WXUNUSED(x), double WXUNUSED(y), int WXUNUSED(keys), int WXUNUSED(attachment))
{
  wxClientDC dc(GetCanvas());
  GetCanvas()->PrepareDC(dc);

  m_canvas->ReleaseMouse();
  dc.SetLogicalFunction(wxCOPY);
  this->Recompute();
  this->ResetControlPoints();

  this->Erase(dc);
/*
  if (!pt->m_eraseObject)
    this->Show(false);
*/

  this->SetSize(pt->sm_controlPointDragEndWidth, pt->sm_controlPointDragEndHeight);

  // The next operation could destroy this control point (it does for label objects,
  // via formatting the text), so save all values we're going to use, or
  // we'll be accessing garbage.
  wxShape *theObject = this;
  wxShapeCanvas *theCanvas = m_canvas;
  bool eraseIt = pt->m_eraseObject;

  if (theObject->GetCentreResize())
    theObject->Move(dc, theObject->GetX(), theObject->GetY());
  else
    theObject->Move(dc, pt->sm_controlPointDragPosX, pt->sm_controlPointDragPosY);

/*
  if (!eraseIt)
    theObject->Show(true);
*/

  // Recursively redraw links if we have a composite.
  if (theObject->GetChildren().GetCount() > 0)
    theObject->DrawLinks(dc, -1, true);

  double width, height;
  theObject->GetBoundingBoxMax(&width, &height);
  theObject->GetEventHandler()->OnEndSize(width, height);

  if (!theCanvas->GetQuickEditMode() && eraseIt) theCanvas->Redraw(dc);
}



// Polygon control points

IMPLEMENT_DYNAMIC_CLASS(wxPolygonControlPoint, wxControlPoint)

wxPolygonControlPoint::wxPolygonControlPoint(wxShapeCanvas *theCanvas, wxShape *object, double size,
  wxRealPoint *vertex, double the_xoffset, double the_yoffset):
  wxControlPoint(theCanvas, object, size, the_xoffset, the_yoffset, 0)
{
  m_polygonVertex = vertex;
  m_originalDistance = 0.0;
}

wxPolygonControlPoint::~wxPolygonControlPoint()
{
}

// Calculate what new size would be, at end of resize
void wxPolygonControlPoint::CalculateNewSize(double x, double y)
{
  double bound_x;
  double bound_y;
  GetShape()->GetBoundingBoxMin(&bound_x, &bound_y);

  double dist = (double)sqrt((x - m_shape->GetX())*(x - m_shape->GetX()) +
                    (y - m_shape->GetY())*(y - m_shape->GetY()));

  m_newSize.x = (double)(dist/this->m_originalDistance)*this->m_originalSize.x;
  m_newSize.y = (double)(dist/this->m_originalDistance)*this->m_originalSize.y;
}


// Implement resizing polygon or moving the vertex.
void wxPolygonControlPoint::OnDragLeft(bool draw, double x, double y, int keys, int attachment)
{
    m_shape->GetEventHandler()->OnSizingDragLeft(this, draw, x, y, keys, attachment);
}

void wxPolygonControlPoint::OnBeginDragLeft(double x, double y, int keys, int attachment)
{
    m_shape->GetEventHandler()->OnSizingBeginDragLeft(this, x, y, keys, attachment);
}

void wxPolygonControlPoint::OnEndDragLeft(double x, double y, int keys, int attachment)
{
    m_shape->GetEventHandler()->OnSizingEndDragLeft(this, x, y, keys, attachment);
}

// Control points ('handles') redirect control to the actual shape, to make it easier
// to override sizing behaviour.
void wxPolygonShape::OnSizingDragLeft(wxControlPoint* pt, bool WXUNUSED(draw), double x, double y, int WXUNUSED(keys), int WXUNUSED(attachment))
{
  wxPolygonControlPoint* ppt = (wxPolygonControlPoint*) pt;

  wxClientDC dc(GetCanvas());
  GetCanvas()->PrepareDC(dc);

  dc.SetLogicalFunction(OGLRBLF);

  wxPen dottedPen(*wxBLACK, 1, wxDOT);
  dc.SetPen(dottedPen);
  dc.SetBrush((* wxTRANSPARENT_BRUSH));

  #if 0 // keys & KEY_CTRL)
  {
    // TODO: mend this code. Currently we rely on altering the
    // actual points, but we should assume we're not, as per
    // the normal sizing case.
    m_canvas->Snap(&x, &y);

    // Move point
    ppt->m_polygonVertex->x = x - this->GetX();
    ppt->m_polygonVertex->y = y - this->GetY();
    ppt->SetX(x);
    ppt->SetY(y);
    ((wxPolygonShape *)this)->CalculateBoundingBox();
    ((wxPolygonShape *)this)->CalculatePolygonCentre();
  }
  #else
  {
    ppt->CalculateNewSize(x, y);
  }
  #endif

  this->GetEventHandler()->OnDrawOutline(dc, this->GetX(), this->GetY(),
       ppt->GetNewSize().x, ppt->GetNewSize().y);
}

void wxPolygonShape::OnSizingBeginDragLeft(wxControlPoint* pt, double x, double y, int WXUNUSED(keys), int WXUNUSED(attachment))
{
  wxPolygonControlPoint* ppt = (wxPolygonControlPoint*) pt;

  wxClientDC dc(GetCanvas());
  GetCanvas()->PrepareDC(dc);

  this->Erase(dc);

  dc.SetLogicalFunction(OGLRBLF);

  double bound_x;
  double bound_y;
  this->GetBoundingBoxMin(&bound_x, &bound_y);

  double dist = (double)sqrt((x - this->GetX())*(x - this->GetX()) +
                    (y - this->GetY())*(y - this->GetY()));
  ppt->m_originalDistance = dist;
  ppt->m_originalSize.x = bound_x;
  ppt->m_originalSize.y = bound_y;

  if (ppt->m_originalDistance == 0.0) ppt->m_originalDistance = (double) 0.0001;

  wxPen dottedPen(*wxBLACK, 1, wxDOT);
  dc.SetPen(dottedPen);
  dc.SetBrush((* wxTRANSPARENT_BRUSH));

  #if 0 // keys & KEY_CTRL)
  {
    // TODO: mend this code. Currently we rely on altering the
    // actual points, but we should assume we're not, as per
    // the normal sizing case.
    m_canvas->Snap(&x, &y);

    // Move point
    ppt->m_polygonVertex->x = x - this->GetX();
    ppt->m_polygonVertex->y = y - this->GetY();
    ppt->SetX(x);
    ppt->SetY(y);
    ((wxPolygonShape *)this)->CalculateBoundingBox();
    ((wxPolygonShape *)this)->CalculatePolygonCentre();
  }
  #else
  {
    ppt->CalculateNewSize(x, y);
  }
  #endif

  this->GetEventHandler()->OnDrawOutline(dc, this->GetX(), this->GetY(),
       ppt->GetNewSize().x, ppt->GetNewSize().y);

  m_canvas->CaptureMouse();
}

void wxPolygonShape::OnSizingEndDragLeft(wxControlPoint* pt, double WXUNUSED(x), double WXUNUSED(y), int keys, int WXUNUSED(attachment))
{
  wxPolygonControlPoint* ppt = (wxPolygonControlPoint*) pt;

  wxClientDC dc(GetCanvas());
  GetCanvas()->PrepareDC(dc);

  m_canvas->ReleaseMouse();
  dc.SetLogicalFunction(wxCOPY);

  // If we're changing shape, must reset the original points
  if (keys & KEY_CTRL)
  {
    ((wxPolygonShape *)this)->CalculateBoundingBox();
    ((wxPolygonShape *)this)->UpdateOriginalPoints();
  }
  else
  {
    SetSize(ppt->GetNewSize().x, ppt->GetNewSize().y);
  }

  ((wxPolygonShape *)this)->CalculateBoundingBox();
  ((wxPolygonShape *)this)->CalculatePolygonCentre();

  this->Recompute();
  this->ResetControlPoints();
  this->Move(dc, this->GetX(), this->GetY());
  if (!m_canvas->GetQuickEditMode()) m_canvas->Redraw(dc);
}

/*
 * Object region
 *
 */
IMPLEMENT_DYNAMIC_CLASS(wxShapeRegion, wxObject)

wxShapeRegion::wxShapeRegion()
{
  m_regionText = wxEmptyString;
  m_font = g_oglNormalFont;
  m_minHeight = 5.0;
  m_minWidth = 5.0;
  m_width = 0.0;
  m_height = 0.0;
  m_x = 0.0;
  m_y = 0.0;

  m_regionProportionX = -1.0;
  m_regionProportionY = -1.0;
  m_formatMode = FORMAT_CENTRE_HORIZ | FORMAT_CENTRE_VERT;
  m_regionName = wxEmptyString;
  m_textColour = wxT("BLACK");
  m_penColour = wxT("BLACK");
  m_penStyle = wxSOLID;
  m_actualColourObject = wxTheColourDatabase->Find(wxT("BLACK"));
  m_actualPenObject = NULL;
}

wxShapeRegion::wxShapeRegion(wxShapeRegion& region):wxObject()
{
  m_regionText = region.m_regionText;
  m_regionName = region.m_regionName;
  m_textColour = region.m_textColour;

  m_font = region.m_font;
  m_minHeight = region.m_minHeight;
  m_minWidth = region.m_minWidth;
  m_width = region.m_width;
  m_height = region.m_height;
  m_x = region.m_x;
  m_y = region.m_y;

  m_regionProportionX = region.m_regionProportionX;
  m_regionProportionY = region.m_regionProportionY;
  m_formatMode = region.m_formatMode;
  m_actualColourObject = region.m_actualColourObject;
  m_actualPenObject = NULL;
  m_penStyle = region.m_penStyle;
  m_penColour = region.m_penColour;

  ClearText();
  wxObjectList::compatibility_iterator node = region.m_formattedText.GetFirst();
  while (node)
  {
    wxShapeTextLine *line = (wxShapeTextLine *)node->GetData();
    wxShapeTextLine *new_line =
      new wxShapeTextLine(line->GetX(), line->GetY(), line->GetText());
    m_formattedText.Append(new_line);
    node = node->GetNext();
  }
}

wxShapeRegion::~wxShapeRegion()
{
  ClearText();
}

void wxShapeRegion::ClearText()
{
  wxObjectList::compatibility_iterator node = m_formattedText.GetFirst();
  while (node)
  {
    wxShapeTextLine *line = (wxShapeTextLine *)node->GetData();
    wxObjectList::compatibility_iterator next = node->GetNext();
    delete line;
    m_formattedText.Erase(node);
    node = next;
  }
}

void wxShapeRegion::SetFont(wxFont *f)
{
  m_font = f;
}

void wxShapeRegion::SetMinSize(double w, double h)
{
  m_minWidth = w;
  m_minHeight = h;
}

void wxShapeRegion::SetSize(double w, double h)
{
  m_width = w;
  m_height = h;
}

void wxShapeRegion::SetPosition(double xp, double yp)
{
  m_x = xp;
  m_y = yp;
}

void wxShapeRegion::SetProportions(double xp, double yp)
{
  m_regionProportionX = xp;
  m_regionProportionY = yp;
}

void wxShapeRegion::SetFormatMode(int mode)
{
  m_formatMode = mode;
}

void wxShapeRegion::SetColour(const wxString& col)
{
  m_textColour = col;
  m_actualColourObject = col;
}

wxColour wxShapeRegion::GetActualColourObject()
{
  m_actualColourObject = wxTheColourDatabase->Find(GetColour());
  return m_actualColourObject;
}

void wxShapeRegion::SetPenColour(const wxString& col)
{
  m_penColour = col;
  m_actualPenObject = NULL;
}

// Returns NULL if the pen is invisible
// (different to pen being transparent; indicates that
// region boundary should not be drawn.)
wxPen *wxShapeRegion::GetActualPen()
{
  if (m_actualPenObject)
    return m_actualPenObject;

  if (!m_penColour) return NULL;
  if (m_penColour == wxT("Invisible"))
    return NULL;
  m_actualPenObject = wxThePenList->FindOrCreatePen(m_penColour, 1, m_penStyle);
  return m_actualPenObject;
}


⌨️ 快捷键说明

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