当前位置:C++技术网 > 资讯 > 如何修改MFC属性页窗口的字体[批量修改控件字体]

如何修改MFC属性页窗口的字体[批量修改控件字体]

更新时间:2016-08-09 11:57:14浏览次数:1+次

最近在做一个MFC的小程序,用到属性表单CPropertySheet,其中创建对话框资源后,修改成属性页的样式,然后关联CPropertyPage类的派生类,然后添加到属性表单对象中,并创建显示。但是在对话框属性中设置字体后,程序运行并没有效果,不知该如何设置属性页的字体?

C++技术网解答:

    属性页是放在属性表单中的对话框,属性表这个对话框的特性和其他单独的对话框是一样的。如果想批量设置对话框中的字体,可以处理WM_CTLCOLOR消息。

    添加消息的类向导界面如下:

 添加消息的类向导界面

    在OnCtlColor函数中,我们可以统一处理对话框的所有控件的颜色,当然这里也可以用来处理字体。因为处理颜色,必然会传递进去CDC指针,通过CDC指针,我们在设置颜色的同时,也就可以设置控件的字体了。

    不同的控件设置方法稍有差别。对于Static控件、编辑框控件以及由这两个控件变种的其他控件的显示都是使用同一种方法,即直接在DC中选择字体,将字体选进DC环境中,这样就可以生效了。

    然而按钮则不能直接这样,稍微复杂点。所以需要调用按钮的字体设置函数SetFont。至于其他的,如果不能通过这两者设置字体,则要根据具体的控件使用具体的字体设置方法。

    在设置字体前,我们需要创建一个字体对象,然后将字体对象中的字体句柄选进设备描述表DC中,使用SelectObject函数。这样,静态控件static和编辑框就生效了。然后再对按钮调用SetFont来设置,这样下压按钮、单选按钮、复选按钮等都生效了。

    下面是效果图:

    这样,在OnCtlColor函数中一次性设置了按钮、静态控件含Group控件、编辑框、列表框和按钮含下压按钮、单选按钮和复选按钮。

    当然,为了简化简单处理,我们直接对触发WM_CTLCOLOR消息的控件设置DC中的字体,同时设置给控件调用SetFont,反正两者总有一个会起作用的,也就不用去分类判断了。如果你要对不同类别的控件做判断,使用nCtlColor来做比较。

    下面是几种控件的类别:


CTLCOLOR_BTN 按钮控件
CTLCOLOR_DLG 对话框
CTLCOLOR_EDIT 编辑框
CTLCOLOR_LISTBOX 列表框
CTLCOLOR_MSGBOX 消息框
CTLCOLOR_SCROLLBAR 滚动条
CTLCOLOR_STATIC 静态文本

    比如要比较当前处理的控件是不是编辑框,代码如下:

if(CTLCOLOR_EDIT==nCtlColor)
    //是编辑框
else
    //不是编辑框
    你也可以用switch大批量的比较,就看你喜欢怎么干了。

    那么设置对话框的字体的代码在OnCtlColor函数中,代码如下:

HBRUSH Ctmp_fontDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);//自动生成

	CFont font;
	font.CreatePointFont(120,_T("楷体"));
	pDC->SelectObject(&font);//让静态控件、编辑框、列表控件字体设置到DC中
	pWnd->SetFont(&font,FALSE);//设置单选和复选按钮,无法通过CTLCOLOR_BTN来判别,直接设置一遍

	//可以同时调用SetTextColor【设置文本颜色】\SetBkMode【设置文字是否透明背景】\SetBkColor【设置文字背景颜色】来修改文字颜色
        pDC->SetTextColor(RGB(0,0,255));
	return hbr;//控件画刷句柄,用于改变背景颜色
}
     颜色就可以自己根据单个控件如何设置在这里也可以实现统一设置。就不再赘述了。