基于GDI+技術(shù)開發(fā)工業(yè)儀表盤控件

寫在前面:
上次給大家看了一個上位機界面之后,很多人表示對那個儀表盤的開發(fā)感興趣,今天就跟大家分享一下整個的開發(fā)過程,由于整個儀表盤開發(fā)的過程還是有些復雜的,無法將所有的代碼都一一展示,所以重點跟大家分享一下開發(fā)的思路,畢竟每個人都會有自己的想法和風格。
01.效果圖展示
先給大家看看實際項目中的應用效果圖:

對于這種儀表盤控件的開發(fā),只能通過GDI+來實現(xiàn)。實際使用中,我們可以根據(jù)需要設(shè)置不同的樣式,包括顏色、角度、量程等等,下面給大家展示一下:
02.控件開發(fā)過程
GDI+開發(fā)控件其實并不是特別難,但是會比較復雜,涉及的東西比較多,需要有一定的空間想象能力,甚至是數(shù)學幾何基礎(chǔ)。
任何一個復雜的GDI+控件,里面無非就是字段(Field)、屬性(Property)、方法(Method)、委托(Delegate)以及事件(Event)。其實屬性是靈魂,GDI+設(shè)計及繪制就是圍繞屬性來進行開發(fā)的。
我們拿到這樣一張效果圖之后,第一步要做的事情是,確定需要設(shè)計哪些屬性?
A:儀表盤部分:
(1)????? GaugeColor:設(shè)置或獲取儀表盤的邊框顏色
(2)??????PointerColor:設(shè)置或獲取儀表盤的指針顏色
(3)??????RangeMin:設(shè)置或獲取量程的最小值
(4)??????RangeMax:設(shè)置或獲取量程的最大值
(5)??????CurrentValue:設(shè)置或獲取當前數(shù)值
(6)??????RangeAlarmMin:設(shè)置或獲取量程報警最小值
(7)??????RangeAlarmMax:設(shè)置或獲取量程報警最大值
(8)?????? TopGap:設(shè)置或獲取整個控件的上下間隙
(9)?????? LeftGap:設(shè)置或獲取整個控件的左右間隙
(10)?? PointerRadius:設(shè)置或獲取中心原點的半徑
(11)?? AlarmColor:設(shè)置或獲取報警線的顏色
B:刻度值部分
(1)??????BigScaleCount:設(shè)置或獲取大刻度數(shù)量
(2)??????SmallScaleCount:設(shè)置或獲取小刻度數(shù)量
(3)??????IsAllowFullCircle:設(shè)置或獲取是否允許整圓顯示
(4)??????ScaleWidth:設(shè)置或獲取刻度值的最大寬度
(5)??????ScaleHeigth:設(shè)置或獲取刻度值的最大高度
C:文本顯示部分
(1)??????TextColor:設(shè)置或獲取文本顏色
(2)??????UnitText:設(shè)置或獲取顯示單位
(3)??????IsTextVisiable:設(shè)置或獲取文本內(nèi)容是否顯示
(4)??????TextGap:設(shè)置或獲取文本顯示位置與刻度的間距
通過一系列的分析之后,確定了設(shè)計以上20種屬性,確定屬性之后,即可通過重寫OnPaint事件進行重繪,重繪步驟又是怎樣的呢?
(1)??????確定整體核心三要素(中心點、偏移角度、圓環(huán)半徑)
(2)?????? 繪制大刻度
(3)?????? 繪制小刻度
(4)?????? 繪制刻度值
(5)?????? 繪制文本
(6)?????? 繪制實時值指針
(7)?????? 繪制報警框
寫在最后:
本文旨在結(jié)合GDI+的相關(guān)技術(shù)介紹了一個儀表盤控件開發(fā)的整個過程,自定義控件在上位機開發(fā)中應用非常廣泛,除了GDI+繪制控件以外,還有擴展控件和組合控件的應用。對于從事上位機開發(fā)的學員來說,學好GDI+是非常有必要的,可以大大增加你項目的擴展性和可視性。

