接下来我们介绍的项目是绘图库中的UI项目,这个项目主要包含两部分内容。第一部分是图元的属性对话框,选中某个图元后右键弹出窗体来设置这个图元的大小、线宽、各种颜色等绘制相关的属性。第二部分是用来保存图元属性的对象。
如下:
主要有以下几类的对象:
DashBoard里是仪表盘绘图对象(由多个不同类型图元组合而成)属性
DigitPanel是数字显示屏的绘图对象属性
Lane目录有多个图元属性对象,包含图道属性、图道坐标刻度属性、曲线属性等
Layout目录中有Container容器布局相关的属性对象。
Share目录中有属性对象的基类SettingBase类和其它对话框基类对象
类图如下:
部分代码示例:
public class SettingBase
{
protected SettingBase()
{
State = EEntityState.Unknown;
LaneCategory = ELaneCategroy.CurveLane;
Name = string.Empty;
LaneWidth = 180;
CanvaCategory = ECanvaCategory.Blank;
DataProvideMethod = EDataProvideMethod.Online;
}
protected SettingBase(string name, EEntityState state)
:this()
{
Name = name;
State = state;
}
public EEntityState State { get; set; }
public ELaneCategroy LaneCategory { get; set; }
public bool IsAxisLane { get; set; }
public SizeF MaxSize { get; set; }
public string Name { get; set; }
public bool Visible { get; set; }
public float Width { get; set; }
public float Height { get; set; }
public float OrgHeight { get; set; }
public float OrgWidth { get; set; }
/// <summary>
/// 字体属性
/// </summary>
public Font Font { get; set; }
/// <summary>
/// 前景色颜色属性
/// </summary>
public Color ForeColor { get; set; }
/// <summary>
/// 背景色颜色属性
/// </summary>
public Color BackColor { get; set; }
public float LaneWidth { get; set; }
public float HeaderHeight { get; set; }
public float HeaderActualHeight { get; set; }
public EDataProvideMethod DataProvideMethod { get; set; }
public ECanvaCategory CanvaCategory { get; set; }
}
对话框示例:
坐标属性设置对话框
曲线设置对话框:
图道设置对话框:
属性对话框调用流程如下:
1)、在图元对应的Painter对象中定义图元的属性设置事件菜单。
protected override void HandleMenuClick(PainterEventArgs e)
{
if (!e.Id.Equals(Id)) return;
base.HandleMenuClick(e);
switch (e.Name)
{
case "UpdateCurve":
ChangePainterSetting(EEntityState.Modified);
break;
case "DeleteCurve":
DeleteItem();
RefreshAll();
break;
case "HideCurve":
ChangeItemVisible(Id, true);
TopPainter.ClearToolWorkShapes();
RefreshWatcher();
break;
case "ShowCurves":
((CurveHeaderPainter)Parent).ShowUnitEntities();
TopPainter.ClearToolWorkShapes();
RefreshAll(true);
break;
case "ShowCurve":
((CurveHeaderPainter)Parent).ShowUnitEntity(e.Tag.ToString());
TopPainter.ClearToolWorkShapes();
RefreshAll(true);
break;
case "MoveUp":
MoveItem(EMoveDirection.Up);
RefreshWatcher();
break;
case "MoveDown":
MoveItem(EMoveDirection.Down);
RefreshWatcher();
break;
}
}
2)在事件处理中,创建图元Setting对象,创建对话框示例,把setting对象传递给对话框,并弹出对话框。
public override void ChangePainterSetting(EEntityState state)
{
if (TopPainter.ParamMetadatas == null)
{
throw WrapException.Warning<UIException>(Resources.S_M_DataNoLoadToWait);
}
Setting.ParamMetadatas = TopPainter.ParamMetadatas;
Setting.Coordinates = ((HeaderPainter) Parent).Coordinates;
Setting.HeaderHeight = Parent.Height;
Setting.HeaderHeightLocked = TopPainter.HistogramHost.Header.HeaderHeightLocked;
Setting.HeaderActualHeight = CalcHeaderActualHeight();
Setting.LeftValue = LeftValue;
Setting.RightValue = RightValue;
Setting.CurveColor = ItemColor;
Setting.CurveFont = ItemFont;
Setting.CurveName = Name;
Setting.PenWidth = PenWidth;
Setting.Name = Name;
Setting.HeaderItemHeight = Height;
Setting.HeaderItemMinHeight = TopPainter.HistogramHost.Header.HeaderItemHeight;
Setting.WitsCode = DataSource.WitsCode;
Setting.ParamUnit = ParamUnit;
Setting.AlarmSetting = AlarmSetting;
var originalSetting = CoreUtility.Clone(Setting);
Setting.HasNextItem =((HeaderPainter)Parent).CheckHasNextCurve(Position);
Setting.ExistedWistCodes = TopPainter.HistogramHost.Header.TotalWisCodeList;
var settingDlg = new CurveSettingDlg(state, Setting) {UiLanguage = TopPainter.UiLanguage};
if (settingDlg.ShowDialog() == DialogResult.OK)
{
Cursor.Current = Cursors.WaitCursor;
LeftValue = Setting.LeftValue;
RightValue = Setting.RightValue;
ItemColor = Setting.CurveColor;
ItemFont = Setting.CurveFont;
ParamCode = Setting.CurveCode;
Name = Setting.CurveName;
PenWidth = Setting.PenWidth;
ChangeCurveItemHeight();
ParamUnit = Setting.ParamUnit;
AlarmSetting = Setting.AlarmSetting;
if (DataSource.WitsCode != Setting.WitsCode)
{
DataSource.WitsCode = Setting.WitsCode;
OnCurveDataChanged();
}
var curvePainter = Entity.Unit as CurvePainter;
if (curvePainter != null)
{
curvePainter.ResetCurveStyle();
if (TopPainter.DataProvideMethod == EDataProvideMethod.Offline)
curvePainter.ReLoadPoints();
if (TopPainter.WatcherMode == EWatcherMode.Playback)
curvePainter.ReLoadPoints();
}
if (settingDlg.IsApplyAllPenWidth)
TopPainter.HistogramHost.ApplyAllItemPenWidth(PenWidth);
if (settingDlg.IsApplyAllItemFont)
TopPainter.HistogramHost.ApplyAllItemFont(ItemFont);
if (settingDlg.IsAppliedAllAlarm)
TopPainter.HistogramHost.ApplyAllItemAlarm(Setting.AlarmSetting);
RefreshHeader();
Cursor.Current = Cursors.Default;
}
else Setting = originalSetting;
base.ChangePainterSetting(state);
}
3)对话框点击OK按钮关闭时,获取新的Setting对象,把对象传回Painter对象,Painter对象根据新的Setting属性,设置图元对象的绘制属性并刷新相关的绘图图元对象。