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

📄 divided.cpp

📁 wxGTK 是 wxWidgets 的 linux GTK+ (>2.2.3)版本。wxWidgets 是一个跨平台的 GUI 框架
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    {      wxDividedShapeControlPoint *controlPoint =        new wxDividedShapeControlPoint(m_canvas, this, i, CONTROL_POINT_SIZE, 0.0, (double)(actualY - GetY()), 0);      m_canvas->AddShape(controlPoint);      m_controlPoints.Append(controlPoint);    }    currentY = actualY;    i ++;    node = node->GetNext();  }}void wxDividedShape::ResetControlPoints(){  // May only have the region handles, (n - 1) of them.  if (m_controlPoints.GetCount() > (GetRegions().GetCount() - 1))    wxRectangleShape::ResetControlPoints();  ResetMandatoryControlPoints();}void wxDividedShape::ResetMandatoryControlPoints(){  double currentY = (double)(GetY() - (m_height / 2.0));  double maxY = (double)(GetY() + (m_height / 2.0));  wxObjectList::compatibility_iterator node = m_controlPoints.GetFirst();  int i = 0;  while (node)  {    wxControlPoint *controlPoint = (wxControlPoint *)node->GetData();    if (controlPoint->IsKindOf(CLASSINFO(wxDividedShapeControlPoint)))    {      wxObjectList::compatibility_iterator node1 = GetRegions().Item(i);      wxShapeRegion *region = (wxShapeRegion *)node1->GetData();      double proportion = region->m_regionProportionY;      double y = currentY + m_height*proportion;      double actualY = (double)(maxY < y ? maxY : y);      controlPoint->m_xoffset = 0.0;      controlPoint->m_yoffset = (double)(actualY - GetY());      currentY = actualY;      i ++;    }    node = node->GetNext();  }}#if wxUSE_PROLOGIOvoid wxDividedShape::WriteAttributes(wxExpr *clause){  wxRectangleShape::WriteAttributes(clause);}void wxDividedShape::ReadAttributes(wxExpr *clause){  wxRectangleShape::ReadAttributes(clause);}#endif/* * Edit the division colour/style * */void wxDividedShape::EditRegions(){  wxMessageBox(wxT("EditRegions() is unimplemented."), wxT("OGL"), wxOK);  // TODO#if 0  if (GetRegions().GetCount() < 2)    return;  wxBeginBusyCursor();  GraphicsForm *form = new GraphicsForm("Divided nodes");  // Need an array to store all the style strings,  // since they need to be converted to integers  char **styleStrings = new char *[GetRegions().GetCount()];  for (int j = 0; j < GetRegions().GetCount(); j++)    styleStrings[j] = NULL;  int i = 0;  wxNode *node = GetRegions().GetFirst();  while (node && node->GetNext())  {    wxShapeRegion *region = (wxShapeRegion *)node->GetData();    char buf[50];    sprintf(buf, "Region %d", (i+1));    form->Add(wxMakeFormMessage(buf));    form->Add(wxMakeFormNewLine());    form->Add(wxMakeFormString("Colour", &region->penColour, wxFORM_CHOICE,              new wxList(wxMakeConstraintStrings(    "Invisible"        ,    "BLACK"            ,    "BLUE"             ,    "BROWN"            ,    "CORAL"            ,    "CYAN"             ,    "DARK GREY"        ,    "DARK GREEN"       ,    "DIM GREY"         ,    "GREY"             ,    "GREEN"            ,    "LIGHT BLUE"       ,    "LIGHT GREY"       ,    "MAGENTA"          ,    "MAROON"           ,    "NAVY"             ,    "ORANGE"           ,    "PURPLE"           ,    "RED"              ,    "TURQUOISE"        ,    "VIOLET"           ,    "WHITE"            ,    "YELLOW"           ,    NULL),    NULL), NULL, wxVERTICAL, 150));    char *styleString = NULL;    switch (region->penStyle)    {      case wxSHORT_DASH:        styleString = "Short Dash";        break;      case wxLONG_DASH:        styleString = "Long Dash";        break;      case wxDOT:        styleString = "Dot";        break;      case wxDOT_DASH:        styleString = "Dot Dash";        break;      case wxSOLID:      default:        styleString = "Solid";        break;    }    styleStrings[i] = copystring(styleString);    form->Add(wxMakeFormString("Style", &(styleStrings[i]), wxFORM_CHOICE,              new wxList(wxMakeConstraintStrings(    "Solid"            ,    "Short Dash"       ,    "Long Dash"        ,    "Dot"              ,    "Dot Dash"         ,    NULL),    NULL), NULL, wxVERTICAL, 100));    node = node->GetNext();    i ++;    if (node && node->GetNext())      form->Add(wxMakeFormNewLine());  }  wxDialogBox *dialog = new wxDialogBox(m_canvas->GetParent(), "Divided object properties", 10, 10, 500, 500);  if (GraphicsLabelFont)    dialog->SetLabelFont(GraphicsLabelFont);  if (GraphicsButtonFont)    dialog->SetButtonFont(GraphicsButtonFont);  form->AssociatePanel(dialog);  form->dialog = dialog;  dialog->Fit();  dialog->Centre(wxBOTH);  wxEndBusyCursor();  dialog->Show(true);  node = GetRegions().GetFirst();  i = 0;  while (node)  {    wxShapeRegion *region = (wxShapeRegion *)node->GetData();    if (styleStrings[i])    {      if (strcmp(styleStrings[i], "Solid") == 0)        region->penStyle = wxSOLID;      else if (strcmp(styleStrings[i], "Dot") == 0)        region->penStyle = wxDOT;      else if (strcmp(styleStrings[i], "Short Dash") == 0)        region->penStyle = wxSHORT_DASH;      else if (strcmp(styleStrings[i], "Long Dash") == 0)        region->penStyle = wxLONG_DASH;      else if (strcmp(styleStrings[i], "Dot Dash") == 0)        region->penStyle = wxDOT_DASH;      delete[] styleStrings[i];    }    region->m_actualPenObject = NULL;    node = node->GetNext();    i ++;  }  delete[] styleStrings;  Draw(dc);#endif}void wxDividedShape::OnRightClick(double x, double y, int keys, int attachment){  if (keys & KEY_CTRL)  {    EditRegions();  }  else  {    wxRectangleShape::OnRightClick(x, y, keys, attachment);  }}wxDividedShapeControlPoint::wxDividedShapeControlPoint(wxShapeCanvas *the_canvas, wxShape *object,  int region, double size, double the_m_xoffset, double the_m_yoffset, int the_type):    wxControlPoint(the_canvas, object, size, the_m_xoffset, the_m_yoffset, the_type){  regionId = region;}wxDividedShapeControlPoint::~wxDividedShapeControlPoint(){}// Implement resizing of divided object divisionvoid wxDividedShapeControlPoint::OnDragLeft(bool WXUNUSED(draw), double WXUNUSED(x), double y, int WXUNUSED(keys), int WXUNUSED(attachment)){    wxClientDC dc(GetCanvas());    GetCanvas()->PrepareDC(dc);    dc.SetLogicalFunction(OGLRBLF);    wxPen dottedPen(*wxBLACK, 1, wxDOT);    dc.SetPen(dottedPen);    dc.SetBrush((* wxTRANSPARENT_BRUSH));    wxDividedShape *dividedObject = (wxDividedShape *)m_shape;    double x1 = (double)(dividedObject->GetX() - (dividedObject->GetWidth()/2.0));    double y1 = y;    double x2 = (double)(dividedObject->GetX() + (dividedObject->GetWidth()/2.0));    double y2 = y;    dc.DrawLine(WXROUND(x1), WXROUND(y1), WXROUND(x2), WXROUND(y2));}void wxDividedShapeControlPoint::OnBeginDragLeft(double WXUNUSED(x), double y, int WXUNUSED(keys), int WXUNUSED(attachment)){    wxClientDC dc(GetCanvas());    GetCanvas()->PrepareDC(dc);    wxDividedShape *dividedObject = (wxDividedShape *)m_shape;    dc.SetLogicalFunction(OGLRBLF);    wxPen dottedPen(*wxBLACK, 1, wxDOT);    dc.SetPen(dottedPen);    dc.SetBrush((* wxTRANSPARENT_BRUSH));    double x1 = (double)(dividedObject->GetX() - (dividedObject->GetWidth()/2.0));    double y1 = y;    double x2 = (double)(dividedObject->GetX() + (dividedObject->GetWidth()/2.0));    double y2 = y;    dc.DrawLine(WXROUND(x1), WXROUND(y1), WXROUND(x2), WXROUND(y2));    m_canvas->CaptureMouse();}void wxDividedShapeControlPoint::OnEndDragLeft(double WXUNUSED(x), double y, int WXUNUSED(keys), int WXUNUSED(attachment)){    wxClientDC dc(GetCanvas());    GetCanvas()->PrepareDC(dc);    wxDividedShape *dividedObject = (wxDividedShape *)m_shape;    wxObjectList::compatibility_iterator node = dividedObject->GetRegions().Item(regionId);    if (!node)    return;    wxShapeRegion *thisRegion = (wxShapeRegion *)node->GetData();    wxShapeRegion *nextRegion = NULL; // Region below this one    dc.SetLogicalFunction(wxCOPY);    m_canvas->ReleaseMouse();    // Find the old top and bottom of this region,    // and calculate the new proportion for this region    // if legal.    double currentY = (double)(dividedObject->GetY() - (dividedObject->GetHeight() / 2.0));    double maxY = (double)(dividedObject->GetY() + (dividedObject->GetHeight() / 2.0));    // Save values    double thisRegionTop = 0.0;    double nextRegionBottom = 0.0;    node = dividedObject->GetRegions().GetFirst();    while (node)    {      wxShapeRegion *region = (wxShapeRegion *)node->GetData();      double proportion = region->m_regionProportionY;      double yy = currentY + (dividedObject->GetHeight()*proportion);      double actualY = (double)(maxY < yy ? maxY : yy);      if (region == thisRegion)      {        thisRegionTop = currentY;        if (node->GetNext())          nextRegion = (wxShapeRegion *)node->GetNext()->GetData();      }      if (region == nextRegion)      {        nextRegionBottom = actualY;      }      currentY = actualY;      node = node->GetNext();    }    if (!nextRegion)      return;    // Check that we haven't gone above this region or below    // next region.    if ((y <= thisRegionTop) || (y >= nextRegionBottom))    return;    dividedObject->EraseLinks(dc);    // Now calculate the new proportions of this region and the next region.    double thisProportion = (double)((y - thisRegionTop)/dividedObject->GetHeight());    double nextProportion = (double)((nextRegionBottom - y)/dividedObject->GetHeight());    thisRegion->SetProportions(0.0, thisProportion);    nextRegion->SetProportions(0.0, nextProportion);    m_yoffset = (double)(y - dividedObject->GetY());    // Now reformat text    int i = 0;    node = dividedObject->GetRegions().GetFirst();    while (node)    {        wxShapeRegion *region = (wxShapeRegion *)node->GetData();        if (region->GetText())        {        wxString s(region->GetText());        dividedObject->FormatText(dc, s.c_str(), i);        }        node = node->GetNext();        i++;    }    dividedObject->SetRegionSizes();    dividedObject->Draw(dc);    dividedObject->GetEventHandler()->OnMoveLinks(dc);}

⌨️ 快捷键说明

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