根据仪表大小动态生成形状

这里主要说说教室状态卡片里的教室如何动态生成。在点击1号楼、2号楼、3号楼的时候,分别显示不同楼的房间数,并可以根据窗口大小适应。

前面的定位帮助里有说到,线性仪表的宽和高是通过AxisLength和BaseFactor指定的,所以我们只需要使用仪表控件的宽和高乘于这2个属性就可以得到仪表的宽和高。

到仪表控件的ItemClick添加以下代码:

  1. '动态生成房间  
  2. If TypeOf e.Item Is c1.Win.C1Gauge.C1GaugeBaseShape AndAlso e.Item.name.endswith("号楼"Then '如果点击的是几号楼形状  
  3.     Dim gg As LinearGauge = e.Gauge  
  4.     gg.CoverShapes.Clear '清空CoverShapes里的形状  
  5.     Dim cm As GaugeColorMap = gg.ColorMaps(0) '获取定义的颜色列表  
  6.       
  7.     Dim rg As GaugeRectangle  
  8.     Dim cap As GaugeCaption  
  9.     Dim cnt As Integer = Rand.Next(20, 40) '这里模拟房间数,可以改为从表格获取  
  10.     Dim cw As Integer = e.Sender.Width * 0.4 - 30 '获取仪表可以放房间的区域宽度 = 控件宽 * AxisLength - 预留的边距  
  11.     Dim ch As Integer = e.Sender.Height * 0.45 * 0.6 '获取仪表可以放房间的区域高度 = 控件高 * BaseFactor * 预留的边距后剩余的高度比例  
  12.     Dim k As Integer = Math.Ceiling(cnt ^ 0.5) '取房间数平方根,按k行k列方式排列房间  
  13.     Dim w As Integer = Math.Floor(cw / k) - 15 '每个房间形状的宽度  
  14.     Dim h As Integer = Math.Floor(ch / k) - 15 '每个房间形状的高度  
  15.     Dim x As Integer = 0 '行的房间索引  
  16.     Dim y As Integer = 0 '列的房间索引  
  17.     Output.Show("Cilck: cw=" & cw & ", ch=" & ch)  
  18.     For i As Integer = 0 To cnt - 1  
  19.         If x = k Then '每行满k个房间后换行  
  20.             x = 0 '下一行从0 开始添加房间  
  21.             y += 1 '列数累加1  
  22.         End If  
  23.         rg = New GaugeRectangle '添加一个房间  
  24.         rg.Viewport.Width = w '宽度  
  25.         rg.Viewport.Height = h '高度  
  26.         rg.Viewport.X = 20 + x * (15 + w) '左边距(X轴)  
  27.         rg.Viewport.Y = 65 + y * (15 + h) '上边距(Y轴)  
  28.         rg.Filling.Color = cm.ValueColors(rand.Next(0, 3)).Color '随机颜色,如果房间数据从表格来,可以根据表格指定的颜色设置  
  29.         gg.CoverShapes.Add(rg)  
  30.           
  31.         cap = New GaugeCaption '添加房间编号  
  32.         cap.Viewport.Width = w '宽度  
  33.         cap.Viewport.Height = h '高度  
  34.         cap.Viewport.X = 20 + x * (15 + w) '左边距(X轴)  
  35.         cap.Viewport.Y = 65 + y * (15 + h) '上边距(Y轴)  
  36.         cap.Text = e.Item.name.replace("号楼""") & Format(i + 1, "00"'如果房间数据从表格来,可以根据表格指定的编号设置  
  37.         cap.Color = Color.White '编号文字颜色  
  38.         gg.CoverShapes.Add(cap)  
  39.         x += 1 '行添加的房间数累加1  
  40.     Next  
  41. End If  

如果需要仪表控件大小发生变化后,房间的大小也一起变化,到窗口SizeChanged添加以下代码:

  1. Dim g As WinForm.Gauges = e.Form.Controls("Guages1")  
  2. Dim lg As LinearGauge = g.Gauges(0)  
  3. Dim cnt As Integer = lg.CoverShapes.Count '获取形状的个数,等于房间个数 * 2  
  4. Dim cw As Integer = g.Width * 0.4 - 30 '获取仪表可以放房间的区域宽度  
  5. Dim ch As Integer = g.Height * 0.45 * 0.6 '获取仪表可以放房间的区域高度  
  6.  
  7. Dim k As Integer = Math.Ceiling((cnt / 2) ^ 0.5) '取房间数平方根,按k行k列方式排列房间  
  8. Dim w As Integer = Math.Floor(cw / k) - 15 '每个房间形状的宽度  
  9. Dim h As Integer = Math.Floor(ch / k) - 15 '每个房间形状的高度  
  10. Dim x As Integer = 0 '行的房间索引  
  11. Dim y As Integer = 0 '列的房间索引  
  12.   
  13. Dim sh As C1.Win.C1Gauge.C1GaugeBaseShape  
  14. For i As Integer = 0 To cnt - 1 Step 2  
  15.     If x = k Then '每行满k个房间后换行  
  16.         x = 0 '下一行从0 开始添加房间  
  17.         y += 1 '列数累加1  
  18.     End If  
  19.     sh = lg.CoverShapes(i)  
  20.     sh.Viewport.Width = w '宽度  
  21.     sh.Viewport.Height = h '高度  
  22.     sh.Viewport.X = 20 + x * (15 + w) '左边距(X轴)  
  23.     sh.Viewport.Y = 65 + y * (15 + h) '上边距(Y轴)  
  24.   
  25.     sh = lg.CoverShapes(i + 1)  
  26.     sh.Viewport.Width = w '宽度  
  27.     sh.Viewport.Height = h '高度  
  28.     sh.Viewport.X = 20 + x * (15 + w) '左边距(X轴)  
  29.     sh.Viewport.Y = 65 + y * (15 + h) '上边距(Y轴)  
  30.     x += 1 '行添加的房间数累加1  
  31. Next