上次,我们已经为我们的对话框添加了关闭按钮,最小化按钮,今天,我们一起为它添加一个标题。因为我们的对话框没有标题栏,所以我们需要添加一个静态控件(Static),来显示标题。
首先我们为对话框添加一个静态控件,并修改它的Caption属性为用户登录,具体如下:
第2步,修改它的ID为IDC_STATIC_CAPTION,具体设置如下:
现在,编译程序效果如下:
大家看到了,现在的标题栏非常丑陋,与背景不协调,现在我们就来美化它,具体步骤如下:
第1步,创建一个MFC类,名称为CCaption,继承自CStatic。
第2步,为其添加一个成员函数HBRUSH CtlColor(CDC* pDC, UINT nCtlColor),当用户界面需要刷新的时候,对话框会收到WM_CTLCOLOR消息,然后它会将这个消息反射给它的所有控件,如果控件中做了消息反射处理(ON_WM_CTLCOLOR_REFLECT()),那么这个控件的背景刷新就不用在对话框的OnCtlColor成员函数中处理,只需要在它的成员函数CtlColor中处理就可以,这样编写代码有利于面向对象的封装,它的具体代码如下:
BEGIN_MESSAGE_MAP(CCaption, CStatic)
ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()
// CCaption 消息处理程序
HBRUSH CCaption::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: 在此更改 DC 的任何特性
CFont font;
LOGFONT lf;
if (!pDC)
return NULL;
//创建一个空画刷,返回这个画刷可以让静态控件的背景透明
HBRUSH hr = (HBRUSH)GetStockObject(NULL_BRUSH);
//让文字的背景透明
pDC->SetBkMode(TRANSPARENT);
//设置文字的颜色为白色
pDC->SetTextColor(RGB(255, 255, 255));
::ZeroMemory(&lf, sizeof(lf));
//设置逻辑字体的高度
lf.lfHeight = 12;
//设置逻辑字体为粗体字
lf.lfWeight = FW_BOLD;
//设置字体为黑体
::lstrcpy(lf.lfFaceName, _T("黑体"));
//用逻辑字体创建一个CFont对象
font.CreateFontIndirect(&lf);
//应用字体
pDC->SelectObject(&font);
return hr;
}
注意,千万不要忘记在Caption.cpp中添加WM_CTLCOLOR消息反射宏,这里是ON_WM_CTLCOLOR_REFLECT()。
第3步,为其添加一个成员函数Init,用来初始化标题栏的位置,具体如下:
void CCaption::Init(int nX, int nY, int nW, int nH)
{
MoveWindow(nX, nY, nW, nH);
}
第4步,为对话框中的静态控件IDC_STATIC_CAPTION添加一个成员变量,类型CStatic,名称为m_staticCap,然后修改它的类型为CCaption。
第5步,在对话框的OnInitDialog中添加标题栏的位置初始化,具体代码如下:
m_staticCap.Init(10, 12, 100, 20);
第6步,编译程序,最终效果如下:
今天我们一起完成了标题栏的美化工作,下次我们一起学习如何美化编辑框控件,从而完成用户登录界面的最终设计。