本系列是本人近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]);
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();
運行結果如下:
3、 位圖BMP填充
準備一個藍天白雲的BMP圖片,要求是真彩24位的那種,效果比較好。選擇方法如下:(以後的有關文件選擇,基本是這種方法)
選擇後,系統生成一個位圖宏定義:IDB_BITMAP2
用以下語句替換2、中的m_DispBrush[4].CreateSolidBrush(WHITE);:
m_DispBrush[2].CreatePatternBrush(NULL, IDB_BITMAP2, IMAGE_BITMAP, 0,0, LR_SHARED)));
CreatePatternBrush用法稍有不同。
運行結果如下:
4、對3、的改進:把白色的背景去掉:
在上節課,大家一定記得在文本框的屬性設置中,有一個“Transparent”的透明選項。很多人會說,改一下就行了。
行嗎?答案是否定的。它只對實芯填充有效。
要改變,必須在Ctlcolor中加一條語句:
pDC->SetBkMode(TRANSPARENT);//北京透明
運行結果如下:
完美!
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、一樣。運行結果如下:
6、本節到此結束,歡迎VC++編程愛好者及廣大讀者踴躍關注,提出寶貴意見。下節再見。
閱讀更多 beijingwanger 的文章