控件颜色的改变

       在VC开发中,有时候会遇到对资源的编辑,比如对话框上控件的大小改变,字体的改变,字体颜色的改变以及控件本身颜色的改变,等等。

       在这里只讨论对控件颜色的改变,并且控件不包含字体。但是此文方法不对按钮控件有效,不过仍具有一定有参考意义。

       假设条件:有一个static静态文本控件,放置在对话框上。

       方法一:响应对话框类中的消息函数OnCtlColor(),在此函数中判断出是否是当前控件ID,如果满足判断,改变控件颜色。代码如下:

HBRUSH CColorSetDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CPropertyPage::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO:  在此更改 DC 的任何属性
	if (pWnd->GetDlgCtrlID() == IDC_PT_COLOR)
	{
		pDC->SetBkColor(RGB(255,0,0));	
	}

	// TODO:  如果默认的不是所需画笔,则返回另一个画笔
	return hbr;
}


IDC_PT_COLOR为需要改变的静态控件ID。网上一般见到的也都是这样的代码和说明。但是经本人亲测,这样是不行的。因为SetBkColor函数改变的不是控件的颜色,而是控件上字体背景的颜色。如果当前控件中没有字体,则控件的颜色不会改变。在假设条件下,我们可以通过设置一些空格。这样既保证了有字符,字符背景颜色被改变,显示效果和控件颜色改变一致,又不会在控件上看到字体。并且代码实现最为简单。


        方法二:同一,响应对话框类中的消息函数OnCtlColor(),在此函数中判断出是否是当前控件ID,如果满足判断,则返回需要设置颜色的画刷。

HBRUSH CColorSetDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CPropertyPage::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO:  在此更改 DC 的任何属性
	if (pWnd->GetDlgCtrlID() == IDC_PT_COLOR)
	{
		return (HBRUSH)m_Ptbrush.m_hObject;	
	}

	// TODO:  如果默认的不是所需画笔,则返回另一个画笔
	return hbr;
}



IDC_PT_COLOR为需要改变的静态控件ID。此方法与方法一最大的不同是,此方法改变的是控件本身的颜色,而方法一改变的是控件上字体背景的颜色,虽然显示效果相同,内部实现原理却截然不同。此方法需要返回的是画刷的变量。可以现在对话框类的头文件中,定义成员变量

CBrush   m_Ptbrush;

然后在构造函数中,将颜色加载进来

m_Ptbrush.CreateSolidBrush(RGB(255,255,255));

通过这样的组合就可以讲控件的颜色改变,只是注意最后在析构函数中,别忘了

m_Ptbrush.DeleteObject();




你可能感兴趣的:(C++/VC)