手把手教你学习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]);



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位的那种,效果比较好。选择方法如下:(以后的有关文件选择,基本是这种方法)

选择蓝天白云BMP图片


选择后,系统生成一个位图宏定义: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);//北京透明

运行结果如下:

蓝天白云完美填充 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、一样。运行结果如下:


CBrush自带网格填充,还可以扩展!


6、本节到此结束,欢迎VC++编程爱好者及广大读者踊跃关注,提出宝贵意见。下节再见。