用VC如何改变编辑框的背景颜色

来源:互联网 发布:刷奥币软件 编辑:程序博客网 时间:2024/05/19 21:01

VC如何改变编辑框的背景颜色
VC中,编辑框的颜色改变起来似乎很难,MFCCEdit类后没有提供可改变颜色的函数。在本文中,我们将重载CEdit类,编写一个可以改变背景颜色的类CMyEdit类,将编辑框的变量定义为CMyEdit类型来实现改变编辑框的背景颜色。

一、构建应用程序
  新建一个基于对话框基础的程序ChangeEdit,然后在对话框的摸板上删除静态文本框,添加三个编辑框。
二、打造自己的CMyEdit
1.添加CMyEdit
  生成好应用程序之后,我们可以利用类向导生成器添加一个新类。
将新类命名为CMyEdit,继承自CEdit类。
2.添加成员变量
  类生成好后,再添加成员变量,在此,我们需要添加三个私有类型的成员变量,COLORREF变量保存当前颜色,CBrush变量保存改变后的刷子颜色,CString变量保存当前编辑框的内容。如下所示。
private:
CBrush m_Brush;
CString m_Text;
COLORREF m_BackColor;
3.添加成员函数
1)添加两个公有类型的成员函数:
public:
void SetControlFocus();
void SetBkGrndColor();
其定义如下:
void CMyEdit::SetControlFocus()

//
将变量m_BackColor的值设为黄色 
m_BackColor = RGB(255,255,0); 
}
void CMyEdit::SetBkGrndColor()
{
//
删除旧的刷子 
m_Brush.DeleteObject();
//
创建一个m_BackColor颜色的刷子 
m_Brush.CreateSolidBrush(m_BackColor); 
CDC* pDC = GetDC();
//
设置文字显示模式,OPAQUE为独占模式 
pDC->SetBkMode(OPAQUE);
//
设置文字的背景颜色 
pDC->SetBkColor(m_BackColor);
//
选择刷子 
pDC->SelectObject(&m_Brush); 
CRect rc;
GetClientRect(&rc);
ScreenToClient(&rc);
//
绘制一个矩形 
pDC->Rectangle(0, 0, rc.Width(), rc.Height());
//
设置文本颜色 
pDC->SetTextColor(RGB(0, 0, 0,));
//
输出文本 
pDC->TextOut(2, 2, m_Text.GetBuffer(m_Text.GetLength()));

}
2)重载虚拟函数OnChildNotify()
  将OnChildNotify()函数的定义为如下形式:
BOOL CMyEdit::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT*pLResult)
{
// We only want to handle WM_CTLCOLOREDIT messages - 32 bit only 
//
如果消息为WM_CTLCOLOREDIT,则返回基类的OnChildNotify函数
if (message != WM_CTLCOLOREDIT) 
{
return CEdit::OnChildNotify(message, wParam, lParam, pLResult);
}
HDC hdcChild = (HDC)wParam;
//
设置文字颜色为黑色,也可以修改为其他颜色
SetTextColor(hdcChild, RGB(0,0,0));
//
设置背景颜色为m_BackColor颜色
SetBkColor(hdcChild, m_BackColor); 
return TRUE;
}
3)添加三个windows消息处理函数:ON_WM_SETFOCUSON_WM_KILLFOCUSON_WM_PAINT,主要是用来处理编辑框获得焦点和失去焦点的颜色改变效果。
  将这三个函数定义为如下形式:
//
当编辑框获得焦点时改变背景颜色为黄色
void CMyEdit::OnSetFocus(CWnd* pOldWnd) 
{
CEdit::OnSetFocus(pOldWnd);
m_BackColor = RGB(255,255,0);
Invalidate(FALSE);
}
//
当编辑框失去焦点时改变背景颜色为白色
void CMyEdit::OnKillFocus(CWnd* pNewWnd) 
{
CEdit::OnKillFocus(pNewWnd);
//
设置背景颜色为白色,也可以设为其他颜色
m_BackColor = RGB(255,255,255);
Invalidate(FALSE); 
}
//
重画编辑框 
void CMyEdit::OnPaint() 
{
CPaintDC dc(this);
// TODO: Add your message handler code here
GetWindowText(m_Text);
SetBkGrndColor();
//
不调用CEdit::OnPaint()
}
4.
完善构造和析构函数
  通过以上的工作,我们作好了CMyEdit类的主体工作,当然,还需要在类的构造函数中设置编辑框的初始颜色信息和刷子信息。在析构函数中删除已经创建的刷子。如下所示:
CMyEdit::CMyEdit()
{
m_BackColor = RGB(255,255,255);
m_Brush.CreateSolidBrush(m_BackColor);
}
CMyEdit::~CMyEdit()
{
m_Brush.DeleteObject();
}
  这样,我们便打造完了自己的CMyEdit类,然后直接在前面生成的应用程序中调用即可。
三、继承CMyEdit
  现在,我们又回到最开始生成的应用程序中,前面已经添加了三个编辑框,这里我们利用ClassWizard来为三个编辑框添加成员变量,分别为这三个编辑框添加一个控制(control)类型的成员变量,特别注意的是继承的基类选择刚才做好的CMyEdit类。
  上面的工作全部做完之后编译运行,你会发现在主程序中不用写一句代码便可改变编辑框的颜色,当编辑框获得输入焦点时,编辑框变为黄色,失去输入焦点时变为白色。  这里介绍的方法还有更多可以改进的地方,我们主要是给大家提供一种思路,希望能起到抛砖引玉的作用。有兴趣的话不妨试试。

0 0
原创粉丝点击