本系列是本人近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 的文章