作爲一個電氣專業,半路出家寫代碼的我來說一直排斥做界面。抑鬱的是,有個項目客戶強烈要求界面展示,沒辦法開始着手看看界面編程,慶幸的是這個項目要求的界面展示還比較簡單,只是靜態展示、連接而已。花了一週時間做出來了,感覺還挺好玩的。
下面是運行的一個截圖,
1、左邊是一個SCD文件中所有的IED列表,右邊是虛端子的連接關係展示;
2、中間的大框是一個IED,左邊是本IED訂閱的其他IED的GOOSE\SV信號,右邊是本IED發佈的GOOSE\SV信號;
3、點擊IED之間的連線,彈出具體的虛端子連接詳情,保護點名、註釋、和點的值;
4、點擊小矩形框,可以切換到小矩形對應的IED中。
在這裏有關SCD文件解析的東西,就不做分享了,主要記錄一下C#界面編程方面的知識點。
這裏主要用到了一個splitcontainer控件、treeview控件、panel控件,繪畫主要在panel控件上。
1、在某一個控件上繪畫的時候,只需要重載該控件的paint方法;
2、獲取控件的工作區域的矩形:
獲取Form1的大小用Rectangle Form1Rect = this.ClientRectangle;獲取某個控件的大小:splitContainer1.Panel2.ClientRectangle;
3、設置控件的工作區域矩形:
drawPanel.SetBounds(0, 0, splitContainer1.Panel2.ClientRectangle.Width, 5 * height / 4);
4、設置滾動條顯示:
panel的屬性設置:Dock設置爲none Anchor設置爲top、left(不能四個全部設置上就行,要不然滾動條怎麼滾動啊)
splitContainer1.Panel2的屬性設置:AutoScroll設置爲TRUE即可
注意:這裏有個小問題,困擾我很久,終於把它解決了。當你切換到一個panel的height比較大,splitcontainer.panel2上出現滾動條的情況下 ,如果將滾動條拉倒下面,然後再切換界面的時候,這時候雖然新界面的height沒有超過form1的height,但是滾動條還是在,看着很煩。想了各種方法,最後找了一個很簡單的方法就是重繪的時候設置滾動條的值爲0即可。splitContainer1.Panel2.VerticalScroll.Value = 0;
5、接下來就是畫布上繪畫了:
Graphics g = e.Graphics;
//畫矩形
SolidBrush SBrush = new SolidBrush(Color.FromArgb(196, 243, 196));//添加畫刷
g.FillRectangle(SBrush, rectangle);//在指定的矩形區域,填充顏色
Pen pen = new Pen(Color.Gray, 2);//添加畫筆
g.DrawRectangle(pen, rectangle);//畫矩形框
//畫線
g.DrawLine(pen, x + 5* width / 6, y + rowHeigh, x + 5 * width / 6, y + heigh);//定義兩個點,根據定義好的筆,畫線即可
//畫文字
Font font = new System.Drawing.Font("宋體",12f);//設置字體
SolidBrush drawBrush = new SolidBrush(Color.Black); // Create brush.
RectangleF stringRect = new RectangleF(x, y, width, heigh); // 設置文字顯示的區域
StringFormat strForm = new StringFormat(); strForm.Alignment = StringAlignment.Center;//這裏主要是設置文字的對齊方式,居中
g.DrawString(this.subiedinfo, this.Font, drawBrush, stringRect, strForm);
至於其他位置變化,矩形大小變化的設計,就依據項目具體實施了。