MFC颜色调配 | vc++6.0颜色设置,如何修改控件颜色

效果展示

1.新建一个MyEdit类,该类继承自CEdit类,并添加相关变量和函数;

在MyEdit类的头文件(.h)中定义如下变量和函数:

private:
	COLORREF m_BackgroundColor;//背景颜色
	COLORREF m_TextColor;//文本颜色	
	CBrush m_brushBk;//笔刷
public:
    void SetBackgroundColor(COLORREF color);//设置背景颜色
	void SetTextColor(COLORREF color);//设置文本颜色
	COLORREF GetBackgroundColor() const;//获取背景颜色
	COLORREF GetTextColor() const;//获取文本颜色

在MyEdit类的源文件(.cpp)中给变量赋初值,并书写函数体如下:

MyEdit::MyEdit()//构造函数
{
	m_BackgroundColor=RGB(0,0,0);
	m_TextColor=RGB(250,250,250);
}
MyEdit::~MyEdit()//析构函数
{
	m_brushBk.DeleteObject();//释放笔刷
}
void MyEdit::SetBackgroundColor(COLORREF color)//设置背景颜色
{
	m_BackgroundColor=color;
}
void MyEdit::SetTextColor(COLORREF color)//设置文本颜色
{
	m_TextColor=color;
}
COLORREF MyEdit::GetBackgroundColor() const//获取背景颜色
{
	return m_BackgroundColor;
}
COLORREF MyEdit::GetTextColor() const//获取文本颜色
{
	return m_TextColor;
}

打开类向导,给MyEdit类添加 =WM_CTLCOLOR 消息反射

在MyEdit类的源文件中的CtlColor()中添加如下代码:

HBRUSH MyEdit::CtlColor(CDC* pDC, UINT nCtlColor) 
{
	// TODO: Change any attributes of the DC here
	m_brushBk.DeleteObject();
	m_brushBk.CreateSolidBrush(m_BackgroundColor);
	pDC->SetBkColor(m_BackgroundColor);
	pDC->SetTextColor(m_TextColor);
	// TODO: Return a non-NULL brush if the parent's handler should not be called
	return (HBRUSH)m_brushBk.GetSafeHandle();
}

2.新建一个ColorMatch类,该类继承于CDialog类,设置对话框页面布局,添加变量和函数;

设置对话框所需要的控件,并进行布局

打开类向导为控件绑定变量

在ColorMatch类的头文件中加入如下代码:

public:
	CFont m_Font;//字体对象
	void SetColor();//设置颜色函数

打开类向导为ColorMatch类添加如下消息映射

在ColorMatch类的源文件中加入如下代码:

BOOL CColorMatch::OnInitDialog()// 初始化函数
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	m_slider_red.SetRange(0,255,false);//设置滑动控件的范围
	m_slider_green.SetRange(0,255,false);//设置滑动控件的范围
	m_slider_blue.SetRange(0,255,false);//设置滑动控件的范围
	m_Font.CreateFont(50,0,0,0,0,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_SWISS,LPCTSTR("Arial"));
	m_EE.SetFont(&m_Font);//设置显示的字体大小
	m_red.SetBackgroundColor(RGB(255,0,0));
	m_green.SetBackgroundColor(RGB(0,255,0));
	m_blue.SetBackgroundColor(RGB(0,0,255));
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CColorMatch::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) /*滑动条被滑动时触发*/
{
	// TODO: Add your message handler code here and/or call default
	SetColor();

	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}


void CColorMatch::SetColor()//设置颜色函数

{
	int red=m_slider_red.GetPos();//获取红色值
	int green=m_slider_green.GetPos();//获取绿色值
	int blue=m_slider_blue.GetPos();//获取黄色值
	COLORREF color=RGB(red,green,blue);//合成RGB值
	m_EE.SetBackgroundColor(color);//设置背景颜色
	m_EE.SetTextColor(16777215-color);//设置字体颜色
	CString colorstr,redstr,greenstr,bluestr;
	colorstr.Format("%d",color);//颜色字符串化
	SetDlgItemText(IDC_EDIT,colorstr);
	redstr.Format("%d",red);
	greenstr.Format("%d",green);
	bluestr.Format("%d",blue);
	SetDlgItemText(IDC_EDIT_RED,redstr);//修改各种颜色的数值
	SetDlgItemText(IDC_EDIT_GREEN,greenstr);
	SetDlgItemText(IDC_EDIT_BLUE,bluestr);
}

3.编译、链接生成可执行文件进行测试。

实际上呢,本片文章用到的就是一个  =WM_CTLCOLOR 消息反射,消息反射就是说子控件,向父对象去请求重绘自己的颜色,文本等,因此这里需要使用一个继承于CEdit类MyEdit类,这样我们的控件才可以在父窗口不重绘的条件下,进行重绘。

猜你喜欢

转载自blog.csdn.net/qq_25036849/article/details/108873174
今日推荐