嵌入式軟件開發 手把手教你學習 VC++ 第三節


嵌入式軟件開發 手把手教你學習 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 類成員變量


按照下圖,添加一個靜態文本框。添加後在右側屬性欄更改屬性。


嵌入式軟件開發 手把手教你學習 VC++ 第三節

vc2010下靜態文本框RC的建立


按照下圖的 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);

}


嵌入式軟件開發 手把手教你學習 VC++ 第三節

CStatic 控件類與ID 值的關係建立


3、在字符串標中添加一串字符串


在字符串生成表中,建立一個字符串定義,如下。方法見下圖:

IDS_CHAPTER_3_1 102 用 CStatic 控件類顯示一行字符串


嵌入式軟件開發 手把手教你學習 VC++ 第三節

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運行,結果如下:

嵌入式軟件開發 手把手教你學習 VC++ 第三節

用定義的 CStatic 類成員變量顯示一串字符串


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顯示一行字符串"

運行結果如下:


嵌入式軟件開發 手把手教你學習 VC++ 第三節

顯示新的串:"直接用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);

運行結果如下:


嵌入式軟件開發 手把手教你學習 VC++ 第三節

同一靜態文本框的不同底色的動態顯示


8、本節到此結束,歡迎 VC++編程愛好者及廣大讀者踴躍關注,提出寶貴意見。

下節再見。


分享到:


相關文章: