嵌入式軟件開發 手把手教你學習 VC++ 第三節
MFC 控件類 CStatic 的用法(三)
本系列是本人近 30 年的編程總結,希望對廣大 VC++編程愛好者有幫助。根據
一些朋友的反饋意見,同時為了兼顧各類編程人員,從今天起,使用 VC++的另
一版本 Visual Studio 2010 進行講解。最新的 VS2018,VS2019 等系列版本做
法基本一致。
本系列為 beijingwanger 王林峰原創作品,禁止抄襲其中的專有圖片、程序範
例以及相關製作的文字說明。
MFC 的 CStatic 用法(三) 用 MFC 控件類 CStatic 進行動態刷新
在第一、二節介紹了通過 CtlColor 消息映射函數進行靜態文本框的實芯填充、
BMP 圖片填充、Windows 自帶網格填充,以及 CBrush、RGB 的簡單使用。
大家可能已經注意到了,一、二節是典型的靜態文本,也就是文本一直為控件的
初始值,未改變。實際使用中,我們會動態地對靜態文本框的字符串進行動態刷
新。本節主要介紹 MFC 的控件類 CStatic 的結構及字符串動態刷新等以下 4 個
問題:
- CStatic 結構定義
- 與靜態資源 ID_STATIC 的關聯
- 用 CStatic 顯示字符串,並用三種形式顯示。
- 同一靜態文本框的不同底色的動態顯示
1、CStatic 的結構定義
CStatic 類是 MFC 的窗口類 CWnd 的一個子類,微軟 MFC 對其類定義如下:
class CStatic : public CWnd
{
DECLARE_DYNAMIC(CStatic)
// Constructors
public:
CStatic();
virtual BOOL Create(LPCTSTR lpszText, DWORD dwStyle,
const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff);
// Operations
HICON SetIcon(HICON hIcon);
HICON GetIcon() const;
HENHMETAFILE SetEnhMetaFile(HENHMETAFILE hMetaFile);
HENHMETAFILE GetEnhMetaFile() const;
HBITMAP SetBitmap(HBITMAP hBitmap);
HBITMAP GetBitmap() const;
HCURSOR SetCursor(HCURSOR hCursor);
HCURSOR GetCursor();
// Overridables (for owner draw only)
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
// Implementation
public:
virtual ~CStatic();
protected:
virtual BOOL OnChildNotify(UINT, WPARAM, LPARAM, RESULT*);
};
由以上 CStatic 類定義大致能看明白一點,即 CStatic 能夠顯示位圖,字符串,
以及窗口類支持的點、線、園、橢圓等等圖形。
2、添加一個 CStatic 類成員變量
按照下圖,添加一個靜態文本框。添加後在右側屬性欄更改屬性。
按照下圖的 CStatic 類控件變量添加嚮導,添加一個 CStatic 控件類,ID 值為
IDC_STATIC_3_1,private 類型,控件變量名為 m_StaticChapter3_1。注意,
此處類別選擇為 control,而不是變量。添加成功後,在"CStaticDemoDlg.cpp"
中會看到下列的數據交換函數 DoDataExchange(CDataExchange* pDX)中,
建立了 IDC_STATIC_3_1 與 CStatic 類 m_StaticChapte3_1 的關聯。
void CCStaticDemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCStaticDemoDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
DDX_Control(pDX, IDC_STATIC_3_1, m_StaticChapte3_1);
}
3、在字符串標中添加一串字符串
在字符串生成表中,建立一個字符串定義,如下。方法見下圖:
IDS_CHAPTER_3_1 102 用 CStatic 控件類顯示一行字符串
4、方法 1:用定義的 CStatic 類成員變量顯示一串字符串
在初始實類BOOL CCStaticDemoDlg::OnInitDialog()中增加如下語句:
CString ChStr; //增加一字符串類 CString ChStr
ChStr.LoadString(IDS_CHAPTER_3_1); //裝入字符串變量到類ChStr
m_StaticChapte3_1.SetWindowTextA(ChStr.operator LPCTSTR());
//顯示到文本框中
Ctrl+F5運行,結果如下:
5、方法 2:用靜態 ID 值直接顯示 一串字符串
執行結果與4、一樣,直接用ID控件值。做一按鈕,在按鈕的映射函數
OnBnClickedButton23()中增加以下代碼:
void CCStaticDemoDlg::OnBnClickedButton23()
{
CString ChStr;
ChStr.LoadString(IDS_CHAPTER_3_2);
CStatic *pStatic = (CStatic *) GetDlgItem(IDC_STATIC_3_1);
pStatic->SetWindowText(ChStr.operator LPCTSTR());
}
執行後點擊按鈕,顯示一個新的串:"直接用CStatic的ID顯示一行字符串"
運行結果如下:
6、方法 3,最簡潔的顯示方法:
方法 1,方法 2 的應用在不同的場合:
方法 1 用於在程序中頻繁刷新的場合,因為不用重複定義
CStatic *pStatic = (CStatic *) GetDlgItem(IDC_STATIC_3_1);
寫法簡化。
方法 2 適用於只有一次的顯示。
方法 3 最簡單:
SetDlgItemText(IDC_STATIC_3_1, ChStr);
7、同一靜態文本框的不同底色的動態顯示
有時我們會遇到一種情況,同一個靜態文本框,隨著狀態的不同,用不同背景、
前景色表示。如股票漲了,用紅底顯示,跌了用綠色顯示,不漲不跌用白底顯示。
在定時器中增加如下語句,用於根據股票的值 m_Stock 的漲落,隨時改變顯示
底色、前景色。
if (m_Stock == V_RISE)
{
m_DispBrush[4].CreateSolidBrush(RED);
m_DispTextColor[4] =RED;
m_DispTextBackColor[4] =RED;
}
else if (m_Stock == V_FALL)
{
m_DispBrush[4].CreateSolidBrush(GREEN);
m_DispTextColor[4] = GREEN;
m_DispTextBackColor[4] = GREEN;
}
else
{
m_DispBrush[4].CreateSolidBrush(WHITE);
m_DispTextColor[4] = WHITE;
m_DispTextBackColor[4] =WHITE;
} //以上顏色僅表示一種色系。
SetDlgItemText(IDC_STATIC_3_1, ChStr);
運行結果如下:
8、本節到此結束,歡迎 VC++編程愛好者及廣大讀者踴躍關注,提出寶貴意見。
下節再見。
閱讀更多 beijingwanger 的文章