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