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

📄 composit.cpp

📁 wxGTK 是 wxWidgets 的 linux GTK+ (>2.2.3)版本。wxWidgets 是一个跨平台的 GUI 框架
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    if (m_parent)    {      m_parent->HitTest(x, y, &attachment, &dist);      m_parent->GetEventHandler()->OnDragLeft(draw, x, y, keys, attachment);    }    return;  }  wxShape::OnDragLeft(draw, x, y, keys, attachment);}void wxDivisionShape::OnBeginDragLeft(double x, double y, int keys, int attachment){  if ((m_sensitivity & OP_DRAG_LEFT) != OP_DRAG_LEFT)  {    attachment = 0;    double dist;    if (m_parent)    {      m_parent->HitTest(x, y, &attachment, &dist);      m_parent->GetEventHandler()->OnBeginDragLeft(x, y, keys, attachment);    }    return;  }  wxShape::OnBeginDragLeft(x, y, keys, attachment);}void wxDivisionShape::OnEndDragLeft(double x, double y, int keys, int attachment){  m_canvas->ReleaseMouse();  if ((m_sensitivity & OP_DRAG_LEFT) != OP_DRAG_LEFT)  {    attachment = 0;    double dist;    if (m_parent)    {      m_parent->HitTest(x, y, &attachment, &dist);      m_parent->GetEventHandler()->OnEndDragLeft(x, y, keys, attachment);    }    return;  }  wxClientDC dc(GetCanvas());  GetCanvas()->PrepareDC(dc);  dc.SetLogicalFunction(wxCOPY);  m_canvas->Snap(&m_xpos, &m_ypos);  GetEventHandler()->OnMovePre(dc, x, y, m_oldX, m_oldY);  ResetControlPoints();  Draw(dc);  MoveLinks(dc);  GetEventHandler()->OnDrawControlPoints(dc);  if (m_canvas && !m_canvas->GetQuickEditMode()) m_canvas->Redraw(dc);}void wxDivisionShape::SetSize(double w, double h, bool recursive){  m_width = w;  m_height = h;  wxRectangleShape::SetSize(w, h, recursive);}void wxDivisionShape::CalculateSize(){}void wxDivisionShape::Copy(wxShape& copy){  wxCompositeShape::Copy(copy);  wxASSERT( copy.IsKindOf(CLASSINFO(wxDivisionShape)) ) ;  wxDivisionShape& divisionCopy = (wxDivisionShape&) copy;  divisionCopy.m_leftSideStyle = m_leftSideStyle;  divisionCopy.m_topSideStyle = m_topSideStyle;  divisionCopy.m_leftSideColour = m_leftSideColour;  divisionCopy.m_topSideColour = m_topSideColour;  divisionCopy.m_leftSidePen = m_leftSidePen;  divisionCopy.m_topSidePen = m_topSidePen;  divisionCopy.m_handleSide = m_handleSide;  // Division geometry copying is handled at the wxCompositeShape level.}#if wxUSE_PROLOGIOvoid wxDivisionShape::WriteAttributes(wxExpr *clause){  wxCompositeShape::WriteAttributes(clause);  if (m_leftSide)    clause->AddAttributeValue(_T("left_side"), (long)m_leftSide->GetId());  if (m_topSide)    clause->AddAttributeValue(_T("top_side"), (long)m_topSide->GetId());  if (m_rightSide)    clause->AddAttributeValue(_T("right_side"), (long)m_rightSide->GetId());  if (m_bottomSide)    clause->AddAttributeValue(_T("bottom_side"), (long)m_bottomSide->GetId());  clause->AddAttributeValue(_T("handle_side"), (long)m_handleSide);  clause->AddAttributeValueString(_T("left_colour"), m_leftSideColour);  clause->AddAttributeValueString(_T("top_colour"), m_topSideColour);  clause->AddAttributeValueString(_T("left_style"), m_leftSideStyle);  clause->AddAttributeValueString(_T("top_style"), m_topSideStyle);}void wxDivisionShape::ReadAttributes(wxExpr *clause){  wxCompositeShape::ReadAttributes(clause);  clause->GetAttributeValue(_T("handle_side"), m_handleSide);  clause->GetAttributeValue(_T("left_colour"), m_leftSideColour);  clause->GetAttributeValue(_T("top_colour"), m_topSideColour);  clause->GetAttributeValue(_T("left_style"), m_leftSideStyle);  clause->GetAttributeValue(_T("top_style"), m_topSideStyle);}#endif// Experimentalvoid wxDivisionShape::OnRightClick(double x, double y, int keys, int attachment){  if (keys & KEY_CTRL)  {    PopupMenu(x, y);  }/*  else if (keys & KEY_SHIFT)  {    if (m_leftSide || m_topSide || m_rightSide || m_bottomSide)    {      if (Selected())      {        Select(false);        GetParent()->Draw(dc);      }      else        Select(true);    }  }*/  else  {    attachment = 0;    double dist;    if (m_parent)    {      m_parent->HitTest(x, y, &attachment, &dist);      m_parent->GetEventHandler()->OnRightClick(x, y, keys, attachment);    }    return;  }}// Divide wxHORIZONTALly or wxVERTICALlybool wxDivisionShape::Divide(int direction){  // Calculate existing top-left, bottom-right  double x1 = (double)(GetX() - (GetWidth()/2.0));  double y1 = (double)(GetY() - (GetHeight()/2.0));  wxCompositeShape *compositeParent = (wxCompositeShape *)GetParent();  double oldWidth = GetWidth();  double oldHeight = GetHeight();  if (Selected())    Select(false);  wxClientDC dc(GetCanvas());  GetCanvas()->PrepareDC(dc);  if (direction == wxVERTICAL)  {    // Dividing vertically means notionally putting a horizontal line through it.    // Break existing piece into two.    double newXPos1 = GetX();    double newYPos1 = (double)(y1 + (GetHeight()/4.0));    double newXPos2 = GetX();    double newYPos2 = (double)(y1 + (3.0*GetHeight()/4.0));    wxDivisionShape *newDivision = compositeParent->OnCreateDivision();    newDivision->Show(true);    Erase(dc);    // Anything adjoining the bottom of this division now adjoins the    // bottom of the new division.    wxNode *node = compositeParent->GetDivisions().GetFirst();    while (node)    {      wxDivisionShape *obj = (wxDivisionShape *)node->GetData();      if (obj->GetTopSide() == this)        obj->SetTopSide(newDivision);      node = node->GetNext();    }    newDivision->SetTopSide(this);    newDivision->SetBottomSide(m_bottomSide);    newDivision->SetLeftSide(m_leftSide);    newDivision->SetRightSide(m_rightSide);    m_bottomSide = newDivision;    compositeParent->GetDivisions().Append(newDivision);    // CHANGE: Need to insert this division at start of divisions in the object    // list, because e.g.:    // 1) Add division    // 2) Add contained object    // 3) Add division    // Division is now receiving mouse events _before_ the contained object,    // because it was added last (on top of all others)    // Add after the image that visualizes the container    compositeParent->AddChild(newDivision, compositeParent->FindContainerImage());    m_handleSide = DIVISION_SIDE_BOTTOM;    newDivision->SetHandleSide(DIVISION_SIDE_TOP);    SetSize(oldWidth, (double)(oldHeight/2.0));    Move(dc, newXPos1, newYPos1);    newDivision->SetSize(oldWidth, (double)(oldHeight/2.0));    newDivision->Move(dc, newXPos2, newYPos2);  }  else  {    // Dividing horizontally means notionally putting a vertical line through it.    // Break existing piece into two.    double newXPos1 = (double)(x1 + (GetWidth()/4.0));    double newYPos1 = GetY();    double newXPos2 = (double)(x1 + (3.0*GetWidth()/4.0));    double newYPos2 = GetY();    wxDivisionShape *newDivision = compositeParent->OnCreateDivision();    newDivision->Show(true);    Erase(dc);    // Anything adjoining the left of this division now adjoins the    // left of the new division.    wxNode *node = compositeParent->GetDivisions().GetFirst();    while (node)    {      wxDivisionShape *obj = (wxDivisionShape *)node->GetData();      if (obj->GetLeftSide() == this)        obj->SetLeftSide(newDivision);      node = node->GetNext();    }    newDivision->SetTopSide(m_topSide);    newDivision->SetBottomSide(m_bottomSide);    newDivision->SetLeftSide(this);    newDivision->SetRightSide(m_rightSide);    m_rightSide = newDivision;    compositeParent->GetDivisions().Append(newDivision);    compositeParent->AddChild(newDivision, compositeParent->FindContainerImage());    m_handleSide = DIVISION_SIDE_RIGHT;    newDivision->SetHandleSide(DIVISION_SIDE_LEFT);    SetSize((double)(oldWidth/2.0), oldHeight);    Move(dc, newXPos1, newYPos1);    newDivision->SetSize((double)(oldWidth/2.0), oldHeight);    newDivision->Move(dc, newXPos2, newYPos2);  }  if (compositeParent->Selected())  {    compositeParent->DeleteControlPoints(& dc);    compositeParent->MakeControlPoints();    compositeParent->MakeMandatoryControlPoints();  }  compositeParent->Draw(dc);  return true;}// Make one control point for every visible linevoid wxDivisionShape::MakeControlPoints(){  MakeMandatoryControlPoints();}void wxDivisionShape::MakeMandatoryControlPoints(){  double maxX, maxY;  GetBoundingBoxMax(&maxX, &maxY);  double x = 0.0 , y = 0.0;  int direction = 0;/*  if (m_leftSide)  {    x = (double)(-maxX/2.0);    y = 0.0;    wxDivisionControlPoint *control = new wxDivisionControlPoint(m_canvas, this, CONTROL_POINT_SIZE, x, y,                                             CONTROL_POINT_HORIZONTAL);    m_canvas->AddShape(control);    m_controlPoints.Append(control);  }  if (m_topSide)  {    x = 0.0;    y = (double)(-maxY/2.0);    wxDivisionControlPoint *control = new wxDivisionControlPoint(m_canvas, this, CONTROL_POINT_SIZE, x, y,                                             CONTROL_POINT_VERTICAL);    m_canvas->AddShape(control);    m_controlPoints.Append(control);  }*/  switch (m_handleSide)  {    case DIVISION_SIDE_LEFT:    {      x = (double)(-maxX/2.0);      y = 0.0;      direction = CONTROL_POINT_HORIZONTAL;      break;    }    case DIVISION_SIDE_TOP:    {      x = 0.0;      y = (double)(-maxY/2.0);      direction = CONTROL_POINT_VERTICAL;      break;    }    case DIVISION_SIDE_RIGHT:    {      x = (double)(maxX/2.0);      y = 0.0;      direction = CONTROL_POINT_HORIZONTAL;      break;    }    case DIVISION_SIDE_BOTTOM:    {      x = 0.0;      y = (double)(maxY/2.0);      direction = CONTROL_POINT_VERTICAL;      break;    }    default:      break;  }  if (m_handleSide != DIVISION_SIDE_NONE)  {    wxDivisionControlPoint *control = new wxDivisionControlPoint(m_canvas, this, CONTROL_POINT_SIZE, x, y,                                             direction);    m_canvas->AddShape(control);    m_controlPoints.Append(control);  }}void wxDivisionShape::ResetControlPoints(){  ResetMandatoryControlPoints();}void wxDivisionShape::ResetMandatoryControlPoints(){  if (m_controlPoints.GetCount() < 1)    return;  double maxX, maxY;  GetBoundingBoxMax(&maxX, &maxY);/*  wxNode *node = m_controlPoints.GetFirst();  while (node)  {    wxDivisionControlPoint *control = (wxDivisionControlPoint *)node->GetData();    if (control->type == CONTROL_POINT_HORIZONTAL)    {      control->xoffset = (double)(-maxX/2.0); control->m_yoffset = 0.0;    }    else if (control->type == CONTROL_POINT_VERTICAL)    {      control->xoffset = 0.0; control->m_yoffset = (double)(-maxY/2.0);    }    node = node->GetNext();  }*/  wxNode *node = m_controlPoints.GetFirst();  if ((m_handleSide == DIVISION_SIDE_LEFT) && node)  {    wxDivisionControlPoint *control = (wxDivisionControlPoint *)node->GetData();    control->m_xoffset = (double)(-maxX/2.0); control->m_yoffset = 0.0;  }  if ((m_handleSide == DIVISION_SIDE_TOP) && node)  {    wxDivisionControlPoint *control = (wxDivisionControlPoint *)node->GetData();    control->m_xoffset = 0.0; control->m_yoffset = (double)(-maxY/2.0);  }  if ((m_handleSide == DIVISION_SIDE_RIGHT) && node)  {    wxDivisionControlPoint *control = (wxDivisionControlPoint *)node->GetData();    control->m_xoffset = (double)(maxX/2.0); control->m_yoffset = 0.0;  }  if ((m_handleSide == DIVISION_SIDE_BOTTOM) && node)  {    wxDivisionControlPoint *control = (wxDivisionControlPoint *)node->GetData();    control->m_xoffset = 0.0; control->m_yoffset = (double)(maxY/2.0);  }}// Adjust a side, returning false if it's not physically possible.bool wxDivisionShape::AdjustLeft(double left, bool test){  double x2 = (double)(GetX() + (GetWidth()/2.0));  if (left >= x2)    return false;  if (test)    return true;  double newW = x2 - left;  double newX = (double)(left + newW/2.0);  SetSize(newW, GetHeight());  wxClientDC dc(GetCanvas());  GetCanvas()->PrepareDC(dc);  Move(dc, newX, GetY());  return true;}bool wxDivisionShape::AdjustTop(double top, bool test){  double y2 = (double)(GetY() + (GetHeight()/2.0));  if (top >= y2)    return false;  if (test)    return true;  double newH = y2 - top;  double newY = (double)(top + newH/2.0);  SetSize(GetWidth(), newH);  wxClientDC dc(GetCanvas());  GetCanvas()->PrepareDC(dc);  Move(dc, GetX(), newY);

⌨️ 快捷键说明

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