📄 divided.cpp
字号:
{ 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", ®ion->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 + -