效果展示
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类的头文件中加入如下代码:
扫描二维码关注公众号,回复:
11845981 查看本文章
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类,这样我们的控件才可以在父窗口不重绘的条件下,进行重绘。