經過了一個學期的考研生活,已經有好幾個月沒有看程序了,手都癢得很。終於考完了試,可以做點小玩意了。下個學期畢設,可能是要用PIC單片機做模擬系統控制程序。電壓,電流采集測量煩得很,今天作這個電子8段管仿真程序就算是提前作個准備吧。
用途
我想電子8段管對大家來說並不是很陌生吧。很多電子設備(如手表,計時器等)都有他們的身影。這個程序就是在計算機上實現對電子8段管的仿真,主要用於對外設輸入量進行顯示。比如說在用RC電路搭接模擬系統仿真設計時,需要測量各種電壓,電流值,我們就可以通過AD轉換器把各種模擬量采集到計算機內。 然後通過這個8段管顯示出來,一個很簡單的數字電壓計就搞定了。
本文的示例程序界面如圖一所示,移動列表項後的示例如圖二所示:
圖一
圖二
程序說明
程序主要目的是實現對模擬8段管類CNumPane功能的封裝:主要功能函數如下:
class CNumPane : public CStatic
{
public:
CNumPane(BOOL bIsShow = FALSE);
public:
void Restore(); //將CEPane內各個參數恢復初始設定值
BOOL bIsShowBackGround; //屬性,是否要繪制8段管的背景數字
void SetBackNumColor(COLORREF ref); // 設置背景數字的顏色
void SetNumColor(COLORREF ref); // 設置前景數字的顏色
void SetBorderColor(COLORREF ref); // 設置控件邊框的顏色
void SetBackGroundColor(COLORREF ref); // 設置控件的背景顏色
void SetShowNumber(CString str); // 設置控件要顯示的數字,
//可以提供float型或者CString型
void SetShowNumber(float f);
};
通過對這些功能的調用就可以實現對8段管的控制。
內部還輔助定義了一個屬於8段管單元的結構:(這個結構主要是用來存儲每個8段管的具體坐標和提供相應的繪制功能)
struct Pane8
{
CPoint m_leftup;
CPoint m_rightup;
CPoint m_leftmid;
CPoint m_rightmid;
CPoint m_leftbottom;
CPoint m_rightbottom; // 對應8段管6個定點坐標
CDC * pDC;
void DrawA() //以下是對A-G段的繪制,用很簡單的LineTo做的
.....
// 以下繪制0-9 10個數字,''-''和''.''符號
void Draw9()
.....
};
程序實現的重點是CNumPane::MakeCoordinate()函數,通過這個函數,在控件大小和要顯示數據確定後,計算出每個8段管的關鍵坐標,構建一個Pane8的數組 pItem來存儲坐標值。(具體實現過程,程序源碼上有詳細介紹)
不足之處
對於8段管繪圖時處理比較簡單,就是MoveTo,LineTo畫的,沒有作出立體效果。並且由於是自己一時突發奇想要作這麼個東西,用了3個小時就草草完工了,可能還有一些隱藏的Bug沒有發現。希望大家能夠指明和糾正。
運行情況
具體的運行效果請編譯好附帶源代碼後執行