在VC中,編輯框的顏色改變起來似乎很難,MFC的CEdit類后沒有提供可改變顏色的函數(shù)。在本文中,我將重載CEdit類,編寫一個可以改變背景顏色的類CMyEdit類,將編輯框的變量定義為CMyEdit類型來實現(xiàn)改變編輯框的背景顏色。
一、構建應用程序
新建一個基于對話框基礎的程序ChangeEdit,然后在對話框的摸板上刪除靜態(tài)文本框,添加三個編輯框。
二、打造自己的CMyEdit類
1.添加CMyEdit類
生成好應用程序之后,我們可以利用類向導生成器添加一個新類。
將新類命名為CMyEdit,繼承自CEdit類。
2.添加成員變量
類生成好后,再添加成員變量,在此,我們需要添加三個私有類型的成員變量,COLORREF變量保存當前顏色,CBrush 變量保存改變后的刷子顏色,CString 變量保存當前編輯框的內(nèi)容。如下所示。
private:
CBrush m_Brush;
CString m_Text;
COLORREF m_BackColor;
3.添加成員函數(shù)
1)添加兩個公有類型的成員函數(shù):
public:
void SetControlFocus();
void SetBkGrndColor();
其定義如下:
void CMyEdit::SetControlFocus()
{
//將變量m_BackColor的值設為黃色
m_BackColor = RGB(255,255,0);
}
void CMyEdit::SetBkGrndColor()
{
// 刪除舊的刷子
m_Brush.DeleteObject();
//創(chuàng)建一個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)重載虛擬函數(shù)OnChildNotify():
將OnChildNotify()函數(shù)的定義為如下形式:
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函數(shù)
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消息處理函數(shù):ON_WM_SETFOCUS、ON_WM_KILLFOCUS、ON_WM_PAINT,主要是用來處理編輯框獲得焦點和失去焦點的顏色改變效果。
將這三個函數(shù)定義為如下形式:
//當編輯框獲得焦點時改變背景顏色為黃色
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();
//不調(diào)用CEdit::OnPaint()
}
4.完善構造和析構函數(shù)
通過以上的工作,我們作好了CMyEdit類的主體工作,當然,還需要在類的構造函數(shù)中設置編輯框的初始顏色信息和刷子信息。在析構函數(shù)中刪除已經(jīng)創(chuàng)建的刷子。如下所示:
CMyEdit::CMyEdit()
{
m_BackColor = RGB(255,255,255);
m_Brush.CreateSolidBrush(m_BackColor);
}
CMyEdit::~CMyEdit()
{
m_Brush.DeleteObject();
}
這樣,我們便打造完了自己的CMyEdit類,然后直接在前面生成的應用程序中調(diào)用即可。
三、繼承CMyEdit類
現(xiàn)在,我又回到最開始生成的應用程序中,前面已經(jīng)添加了三個編輯框,這里我利用ClassWizard來為三個編輯框添加成員變量,分別為這三個編輯框添加一個控制(control)類型的成員變量,特別注意的是繼承的基類選擇剛才做好的CMyEdit類。
上面的工作全部做完之后編譯運行,你會發(fā)現(xiàn)在主程序中不用寫一句代碼便可改變編輯框的顏色,當編輯框獲得輸入焦點時,編輯框變?yōu)辄S色,失去輸入焦點時變?yōu)榘咨! ?/p>
這里介紹的方法還有更多可以改進的地方,我主要是給大家提供一種思路,希望能起到拋磚引玉的作用。有興趣的話不妨試試。