看了VC知識庫《在線雜志》第27期的“電子八段管的仿真”,確實不錯,但失真嚴重。認識咱們知識庫這麼久,學了不少東西,我也該作點"貢獻"了,於是自己動手也寫一個。本文的示例程序界面如圖一所示:
圖一
程序說明
首先建立一個基於對話框的工程,導入數碼位圖資源,直接在對話框類CMy2Dlg中添加類mytime
程序中的mytime類主要提供兩個函數接口:一個是set()用來設置顯示位置;一個是myfun()用來設置顯示數字來顯示。
class mytime
{
public:
int change(char);
mytime();
~mytime();
CString m_time;
void myfun(CString temp);//顯示數字字符串
void set(CDialog *,int tnum,int tx,int ty,int tspace);//設置顯示位置
CStatic *m_pictur[20];// 靜態圖 指針 數組
int num;// 靜態圖個數
int x;// 起始X坐標
int y;// 起始Y坐標
int space;// 各數碼之間 間距
};
主要成員函數set()和myfun():
void mytime::myfun(CString temp)
{
m_time=temp;
int mynum=m_time.GetLength();
for(int k=0;k<num-mynum;k++)//添加前面空圖標顯示
{
CImageList m_imgList;
m_imgList.Create(IDB_BITMAP1,12, 1, RGB(255,255,255));//創建位圖鏈 每個位圖12像素
HICON myico= m_imgList.ExtractIcon(10); //取出圖標
m_pictur[k]->SetIcon(myico);//設置顯示的圖標
}
for(int i=k;i<num;i++)//添加數字圖標顯示
{
CImageList m_imgList;
m_imgList.Create(IDB_BITMAP1,12, 1, RGB(255,255,255));
HICON myico= m_imgList.ExtractIcon(change(m_time[i-k]));
m_pictur[i]->SetIcon(myico);
}
}
void mytime::set(CDialog *parent,int tnum,int tx,int ty,int tspace)
{
CMy2Dlg *mypar=(CMy2Dlg*)parent;
for(int i=0;i<num;i++)// 刪除以前分配的
delete *(m_pictur+i);
// 設置各成員變量
num=tnum; x=tx;y=ty;space=tspace;
for(int j=0;j<num;j++)//重新分配
m_pictur[j]=new(CStatic);
for(int k=0;k<num;k++)
{
//確定顯示位置
CRect aa1(x+k*(space+12),y,40+x+k*(space+12),40+y);
m_pictur[k]->Create(NULL,SS_ICON,aa1,mypar,1);// 創建靜態圖標控件
m_pictur[k]->ShowWindow(true);
}
}
然後在CMy2Dlg類中加入CMy2Dlg::OnTimer()消息響應函數以實現時鐘功能,其它具體代碼看源碼內有詳細說明。
程序中難免有不足和BUG,歡迎指正。