//============================================================ // <T>开始设计。</T> // // @param x 横坐标 // @param y 纵坐标 // @param modeEnable 模式切换 // @param appendMode 追加模式 // @param testArgs 测试参数 //============================================================ public void DesignBegin(int x, int y, bool modeEnable, bool appendMode, SUiTestArgs testArgs = null) { FUiControl focusControl = _selection.FocusControl; // 设置落点 _mouseDownPoint.Set(x, y); // 更新游标 UpdateCursor(x, y); // 设计模式 switch ((ERcAlign)_aideAlignCd) { case ERcAlign.Center: if (modeEnable) { _designMode = EUiDesignMode.Move; _selection.BoundsStore(); } break; case ERcAlign.Left: case ERcAlign.Right: case ERcAlign.Top: case ERcAlign.Bottom: case ERcAlign.LeftTop: case ERcAlign.RightBottom: case ERcAlign.RightTop: case ERcAlign.LeftBottom: if (modeEnable) { _designMode = EUiDesignMode.Size; _selection.BoundsStore(); } break; case ERcAlign.None: _designMode = EUiDesignMode.None; // 选择控件 SUiTestArgs args = TestPoint(x, y, testArgs); FUiControl selectControl = args.Control; if (appendMode && (selectControl != null) && _selection.HasSelectControl()) { // 追加模式下,只能增加同父亲的对象 if (selectControl.Parent == focusControl.Parent) { _selection.AddSelectControl(selectControl); } } else { _selection.FocusControl = selectControl; } break; } }
//============================================================ // <T>绘制处理。</T> // // @param args 参数 //============================================================ public override void Draw(SUiDrawArgs args) { // 设置数据 bool visible = TestVisible(); SIntPoint2 position = CalculatePosition(); args.Position.Assign(position); // 计算数据 _designLocation.Assign(CalculateDisplayPosition()); _designSize.Assign(CalculateDisplaySize()); // 开始层处理 _deviceLayer.Begin(_designLocation.X, _designLocation.Y, _designSize.Width, _designSize.Height); // 检查可见性 if (visible) { OnDrawBegin(args); } //............................................................ // 子控件测试 if (_activePage != null) { // 绘制分页 _activePage.Draw(args); // 绘制节点 if (_components != null) { foreach (FUiComponent componment in _components) { FUiControl control = componment as FUiControl; if (control == null) { continue; } if (control is FUiPage) { continue; } control.Draw(args); } } } //............................................................ // 结束绘制 if (visible) { _context.Context.TransformLocation(_designLocation.X, _designLocation.Y); OnDrawAfter(args); } // 结束层处理 _deviceLayer.End(); }
//============================================================ // <T>测试处理。</T> // // @param args 参数 //============================================================ public override void Test(SUiTestArgs args) { // 检查有效性 if (!PageControlResource.OptionValid) { return; } // 开始测试 bool result = OnTest(args); // 子控件测试 if (result) { if (_activePage != null) { // 测试分页 _activePage.Test(args); // 绘制节点 if (_components != null) { foreach (FUiComponent componment in _components) { FUiControl control = componment as FUiControl; if (control == null) { continue; } if (control is FUiPage) { continue; } control.Test(args); } } } } }
//============================================================ // <T>更新设计。</T> //============================================================ public void DesignUpdate(int x, int y) { float scale = _context.Scale; FUiControl focusControl = _selection.FocusControl; // 偏移位置 int cx = x - _mouseDownPoint.X; int cy = y - _mouseDownPoint.Y; // 设计更新 switch (_designMode) { case EUiDesignMode.None: UpdateCursor(x, y); break; case EUiDesignMode.Move: { int cleft = (int)(cx / scale) / _cellSize.Width * _cellSize.Width; int ctop = (int)(cy / scale) / _cellSize.Height * _cellSize.Height; _selection.BoundsLocation(cleft, ctop); break; } case EUiDesignMode.Size: { int left = 0; int top = 0; int width = 0; int height = 0; switch ((ERcAlign)_aideAlignCd) { case ERcAlign.Left: left += cx; width -= cx; break; case ERcAlign.LeftTop: left += cx; width -= cx; top += cy; height -= cy; break; case ERcAlign.Top: top += cy; height -= cy; break; case ERcAlign.RightTop: top += cy; width += cx; height -= cy; break; case ERcAlign.Right: width += cx; break; case ERcAlign.RightBottom: width += cx; height += cy; break; case ERcAlign.Bottom: height += cy; break; case ERcAlign.LeftBottom: left += cx; width -= cx; height += cy; break; } int cleft = (int)(left / scale) / _cellSize.Width * _cellSize.Width; int ctop = (int)(top / scale) / _cellSize.Height * _cellSize.Height; int cwidth = (int)(width / scale) / _cellSize.Width * _cellSize.Width; int cheight = (int)(height / scale) / _cellSize.Height * _cellSize.Height; _selection.BoundsSet(cleft, ctop, cwidth, cheight); break; } } // 刷新处理 Refresh(); }
//============================================================ // <T>绘制辅助线。</T> //============================================================ public bool DrawAidLines() { // 检查状态 FUiControl focusControl = _selection.FocusControl; if (focusControl == null) { return(false); } FUiControl parent = focusControl.Parent as FUiControl; if (parent == null) { return(false); } // 获得环境 float scale = _context.Scale; FDxContext2d context = _context.Context; context.TransformIdentity(); // 绘制对齐线 SIntPoint2 location = focusControl.CalculateDisplayPosition(); SIntSize2 size = focusControl.CalculateDisplaySize(); foreach (FUiComponent component in parent.Components) { FUiControl control = component as FUiControl; // 检查变量 if (control == null) { continue; } if (control == focusControl) { continue; } // 计算坐标 SIntPoint2 findLocation = control.CalculateDisplayPosition(); SIntSize2 findSize = control.CalculateDisplaySize(); // 左辅助线 if (location.X == findLocation.X) { context.DrawLineLayer(location.X, 0, location.X, _size.Height, _lineBackBrush, _lineForeBrush, _lineWidth, _lineForeStrokeStyle); } // 上辅助线 if (location.Y == findLocation.Y) { context.DrawLineLayer(0, location.Y, _size.Width, location.Y, _lineBackBrush, _lineForeBrush, _lineWidth, _lineForeStrokeStyle); } // 右辅助线 int right = findLocation.X + findSize.Width; if (location.X + size.Width == right) { context.DrawLineLayer(right, 0, right, _size.Height, _lineBackBrush, _lineForeBrush, _lineWidth, _lineForeStrokeStyle); } // 下辅助线 int bottom = findLocation.Y + findSize.Height; if (location.Y + size.Height == bottom) { context.DrawLineLayer(0, bottom, _size.Width, bottom, _lineBackBrush, _lineForeBrush, _lineWidth, _lineForeStrokeStyle); } } return(true); }