设计频率仪表
本节的任务是设计一个下图所示的仪表,该仪表会显示不同频率信号的强度:
这个仪表其实很简单,就三种组件,一个黑色的长方形(Rectangle)做背景,10个Caption用于显示频率,10个Marks用于显示各频率的信号幅度。
设计这个仪表的第一个关键点,是合理安排Caption和Marks的位置,避免相互遮挡。
我们知道Marks和Labels都会显示在有效工作区中(0到1),如果将Caption显示在有效工作区之外(小于0或大于1),那么Caption就不会相互遮挡了。
设计这个仪表的第二个关键点是不用指针(Pointer)了,而是通过Marks的颜色显示值的幅度,这一点我们已经在Marks和颜色值范围这一节讲过了,只是这次换成了线性仪表。
设计过程
这个仪表有10个Marks,分别对应10个频率,设计要点如下:
1、增加一个空白的线性仪表,然后:
1,1、将Orientation设置为Vertical,使其成为垂直仪表。
1.2、将IsReversed设置为True,使得从Minimum到Maximum的显示方向为从下往上。
1.3、将Pointer的Visible属性设置为False(隐藏主指针)。
1.4、将BaseOrigin属性设置为0.025,将BaseFactor属性设置为0.95,也就是工作区宽度为0.95,两边各留空0.025
1.5、将AxisStart属性设置为0.0,AxisLength为
默认的0.9,也就是有效工作区高度为0.9,下边留空0.1,留空的部分用于显示Caption(频率),这一步很关键。
2、增加一个Rectangle,然后:
2.1、将其Border的LineStyle设置为None,Filling的Color属性设置为Black,使其成为一个黑色无边框的长方形。
2.2、由于前面将AxisLength设置为0.9,所以尽管
Rectangle的默认高度是1,但这里的1实际等于0.9,所以需要ViewPort的ScaleY属性设置为1.12,也就是高度向下扩大1.12倍,
这样Rectangle的高度就约等于实际的1。
通过1.5和2.2两个步骤,我们将Gauge的工作区分为两部分,上面的0.9用于显示Marks,下面的0.1用于显示Caption:
3、在MorePointers集合中增加10个指针,每个指针的SweepTime属性设置1(因为需要动画效果)
,Visible属性设置为False(因为这里不需要显示指针)。
3.1、为了方便设计,建议给每个指针的Value属性设置一个0到100之间的值,因为使用默认值为0的话,没有办法在设计过程看到Marks的变化。
4、在FaceShapes集合中增加10个Caption,Color属性为White(白色),Font属性为3,然后:
4.1、Text属性分别为31HZ、62、125、250、500、1KHZ、2、4、6、16KHZ
4.2、CenterPountX属性分别为0.055、0.15、0.25、0.35、0.45、0.55、0.65、0.75、0.85、0.95,也就是每个Caption的间隔约为0.1。
4.3、所有Caption的CenterPountY属性设置为1.07,也就是Caption显示在有效工作区之外,避免其被后面增加的Marks遮挡。
现在的仪表看起来是这样的:
5、在Decorators集合中增加10个Marks,然后:
5.1、将全部Marks的IntervalWidth属性设置为3,Width属性设置为2,Length属性设置为7,Shape属性设置为Round,ValueColorFalloff设置为None,请注意:
A、这里用的是IntervalWidth,不是Interval。
B、IntervalWidth为3,Width为2,也就是每隔3个逻辑宽度绘制一个Mark,每个Mark自身的逻辑宽度为2,所以相邻Mark之间会有空白,这个空白的逻辑宽度为1(3-2=1)。
5.2、各Marks的Location属性分别为5、15、25、35、45、55、65、75、85、95,也就是每个Marks的间隔为10。
5.3、开始将各个Marks的颜色绑定到对应的指针,以第一个Marks为例,编辑其ValueColors即可,增加两个项目,分别为:
|
第一个项目的意思是,这个Marks从0值开始,这个Marks的颜色为"Khaki"。
第二个项目没有设置Value,而是将其PointerIndex设置为0,意思是从第一个指针(编号为0)的值开始,这个Marks的颜色改为DimGray(50%的透明度)。
假定第一个指针的Value为9,设置完成后,仪表的样子是:
依次设置其他Marks,按顺序绑定到对应的指针,并设置其ValueColors,最后得到的仪表为:
我把这个仪表保存为一个模板文件了,如果你按照上述步骤来无法实现,你可以下载模板文件来参考:
模版文件
现在你可以通过代码设置各个频率的幅度:
Dim ggs As WinForm.Gauges =
e.Form.Controls("Guages1")
ggs.LinearGauge.MorePointers(0).Value = 37
ggs.LinearGauge.MorePointers(1).Value = 75
ggs.LinearGauge.MorePointers(2).Value = 46
ggs.LinearGauge.MorePointers(3).Value = 27
ggs.LinearGauge.MorePointers(4).Value = 62
ggs.LinearGauge.MorePointers(5).Value = 89
ggs.LinearGauge.MorePointers(6).Value = 44
ggs.LinearGauge.MorePointers(7).Value = 58
ggs.LinearGauge.MorePointers(8).Value = 50
ggs.LinearGauge.MorePointers(9).Value = 9
建议给每个指针设置Name,这样就可以通过Name来引用指针了:
ggs.LinearGauge.MorePointers("my31hz").Value = 37