手把手教你學習VC++編程 第二節MFC 的CStatic用法(二)


本系列是本人近30年的編程總結,希望對廣大VC++編程愛好者有幫助。為了兼顧各類編程人員,使用VC++的早期版本VC++6.0,最新的VS 2015,VS2018,VS2019等系列版本做法基本一致。

本系列為beijingwanger王林峰原創作品,禁止抄襲其中的專有圖片、程序範例以及相關製作的文字說明。

CStatic是VC++的MFC(基礎函數類)中很重要的一個控件類,它與靜態文本框資源RC相連接。它的用法非常廣泛。本以實類的形式,逐一介紹。為了減少篇幅,使用快捷鍵代替鼠標操作。

MFC 的CStatic用法(二) 靜態文本框的三種典型填充方式

在第一節介紹了通過CtlColor消息映射函數來改變靜態顯示框的背景色、前景色及填充畫刷顏色,只簡單地介紹了色號。實際上還有很多要點需要掌握,如背景的各種圖案、BMP圖形填充。

這一節逐個教你如何做靜態文本框的實芯填充、BMP圖片填充、Windows自帶網格填充等內容,以及畫刷、RGB的簡單使用。

在HBRUSH CCStaticDemoDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) BOOL CreateSolidBrush(COLORREF crColor)消息處理函數中,必須返回一個畫刷,它表示在下一次的靜態文本調用時,靜態文本框用此顏色進行填充。

1、 靜態文本框的背景色、前景色

RGB是windwos的一個函數宏定義,原型如下:

#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))

看上去很繁瑣,實際上它就是顏色三原色紅、綠、藍的分量定義。在使用時,你只需要按照紅、綠、藍的0~255的分量值填寫就行了。

如,白色RGB(255,255,255),紅顏色RGB(255,0,0)。

需要的典型顏色值可以通過畫筆中的顏色表進行直接選取,不用刻意地去記憶。如下圖,得到橘紅色,RGB(244,122,70),那麼做如下的宏定義:

#define ORANGE_COLOR RGB(244,122,70)

在以後做軟件時,可以直接用ORANGE_COLOR 表示橘紅顏色了,而不用再寫RGB(244,122,70)

用CDC 類指針*pDC成員函數SetTextColor來設置前景文本顏色,SetBkColor來設置背景顏色,先在本文的演示程序的對話框類CCStaticDemoDlg中定義如下私有成員函數(以後的定義,如果沒有特殊說明,都是Private):

Private:

COLORREF m_DispTextColor[16];

COLORREF m_DispTextBackColor[16];

其中COLORREF 的類型定義如下:

typedef DWORD COLORREF;

pDC->SetTextColor(m_DispTextColor[COLOR_NUM_1]);

pDC->SetBkColor(m_DispTextBackColor[COLOR_NUM_1]);


手把手教你學習VC++編程 第二節MFC 的CStatic用法(二)


2、什麼是填充畫刷?典型畫刷類型有幾種?

Windwos MFC提供了一個典型的畫刷類CBrush。通俗地講,CBrush用於填充控件的背景顏色及形式。注意形式二字,可以是實芯的,也可以是圖形,也可以是其它的固定格式。

刷類CBrush支持7中畫刷形式,原型如下:

BOOL CreateSolidBrush(COLORREF crColor);

BOOL CreateHatchBrush(int nIndex, COLORREF crColor);

BOOL CreateBrushIndirect(const LOGBRUSH* lpLogBrush);

BOOL CreatePatternBrush(CBitmap* pBitmap);

BOOL CreateDIBPatternBrush(HGLOBAL hPackedDIB, UINT nUsage);

BOOL CreateDIBPatternBrush(const void* lpPackedDIB, UINT nUsage);

BOOL CreateSysColorBrush(int nIndex);

其中以下3種最常用常用,它們是:

網格填充畫刷,原型為:BOOL CreateHatchBrush(int nIndex, COLORREF crColor);

位圖填充畫刷,原型為:BOOL CreatePatternBrush(CBitmap* pBitmap);

常用的實芯填充畫刷,原型為:BOOL CreateSolidBrush(COLORREF crColor);

先定義如下的畫刷類:

CBrush m_DispBrush[16]; // graph window color and legend background color

以下分別介紹三種填充的用法:

2、 實芯填充

用白顏色填充,定義如下:

m_DispBrush[4].CreateSolidBrush(WHITE);在在HBRUSH CCStaticDemoDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 中,return m_DispBrush[COLOR_NUM_4].operator HBRUSH();

運行結果如下:

手把手教你學習VC++編程 第二節MFC 的CStatic用法(二)

實芯填充


3、 位圖BMP填充

準備一個藍天白雲的BMP圖片,要求是真彩24位的那種,效果比較好。選擇方法如下:(以後的有關文件選擇,基本是這種方法)

手把手教你學習VC++編程 第二節MFC 的CStatic用法(二)

選擇藍天白雲BMP圖片


選擇後,系統生成一個位圖宏定義:IDB_BITMAP2

用以下語句替換2、中的m_DispBrush[4].CreateSolidBrush(WHITE);

m_DispBrush[2].CreatePatternBrush(NULL, IDB_BITMAP2, IMAGE_BITMAP, 0,0, LR_SHARED)));

CreatePatternBrush用法稍有不同。

運行結果如下:

手把手教你學習VC++編程 第二節MFC 的CStatic用法(二)

藍天白雲充,底色為白色,不完美


4、對3、的改進:把白色的背景去掉:

在上節課,大家一定記得在文本框的屬性設置中,有一個“Transparent”的透明選項。很多人會說,改一下就行了。

行嗎?答案是否定的。它只對實芯填充有效。

要改變,必須在Ctlcolor中加一條語句:

pDC->SetBkMode(TRANSPARENT);//北京透明

運行結果如下:

手把手教你學習VC++編程 第二節MFC 的CStatic用法(二)

藍天白雲完美填充 perfect!


完美!

5、CBrush自帶網格填充畫刷:

MFC 的CBrush類,支持6種填充畫刷,宏定義分別如下:

· HS_BDIAGONAL : ///// 45度從左到右向上填充

· HS_CROSS: +++++ 正十字填充

· HS_DIAGCROSS: xxxxx 45度十字填充

· HS_FDIAGONAL: \\\\\\\\\\ 45度從左到右向下填充

· HS_HORIZONTAL: -----水平填充畫刷

· HS_VERTICAL: ||||| 垂直填充畫刷

這裡,我們設置為HS_DIAGCROSS xxxxx 45度十字填充形式,填充顏色用LIGHTBLUE;

m_DispBrush[5].CreateHatchBrush(HS_DIAGCROSS,LIGHTBLUE);

與4、一樣,也有一個透明度改變,編程與4、一樣。運行結果如下:


手把手教你學習VC++編程 第二節MFC 的CStatic用法(二)

CBrush自帶網格填充,還可以擴展!


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



分享到:


相關文章: