在VC中,標准的WINDOWS控件如TREEVIEW,EDITBOX,COMBOBOX和LISTBOX等控件都不支持選擇背景位圖的屬性,所以如果要使這些標准控件達到這種效果,必須有些非常規的方法。本文介紹一個CEDIT類如何實現背景位圖,並且可以更換背景的例子。可能實現的方法還有其它種,如果有興趣可以大家探討。
本文程序運行效果圖
下面介紹CMYEDITCTRL類幾個關鍵變量和函數。
第一步在該類中增加幾個變量;
public:
CBitmap m_bmp;
protected:
CBrush m_brHollow;
CBitmap *m_pbmCurrent;
第二步 重載部分函數:
afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnChange();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
各個函數的具體作用:
2.1 OnChange();
如果沒有這個函數,你敲幾個字符如 ABCDEDFG,然後刪除兩個FG,但是EDITBOX並未更新。添加這個函數主要是這個原因。
void CMyEditCtrl::OnChange()
{
Invalidate(); ///強制進行更新
}
2.2 OnLButtonUp();
也類似,是你鼠標選擇時候的刷新問題,如果你有興趣,可以先把它注釋掉,看看BUG是怎麼出現的。
void CMyEditCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
Invalidate(); ///強制進行更新
CEdit::OnLButtonUp(nFlags, point);
}
2.3 CtlColor(CDC* pDC, UINT nCtlColor)
一般的文字的默認背底是白色的,這兒選擇了透明的形式,所以底圖可以顯示。
HBRUSH CMyEditCtrl::CtlColor(CDC* pDC, UINT nCtlColor)
{
pDC->SetBkMode(TRANSPARENT); ///選擇透明背景模式
pDC->SetTextColor(RGB(0xff,0xff,0xff)); ///設置文字顏色為白色
return m_brHollow;
}
2.4 OnEraseBkgnd(CDC* pDC)
主要把選好的背景位圖顯示出來。
BOOL CMyEditCtrl::OnEraseBkgnd(CDC* pDC)
{
BITMAP bm;
m_bmp.GetBitmap(&bm);
m_pbmCurrent = &m_bmp;
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dcMem.SelectObject(m_pbmCurrent); ///選擇位圖
pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dcMem,0,0,SRCCOPY); ///畫出位圖
dcMem.SelectObject(pOldBitmap);
return TRUE;
}
說明:其中代碼有些部分簡化了,有些部分還可以優化。對於底圖的選擇,在這裡我選擇是與我EDITBOX一樣大小的底圖,如果兩者不一樣大小,需要修改部分OnEraseBkgnd(CDC* pDC)代碼。
基本上這個類的功能就這樣實現了。
如果有興趣和我一起探討這個問題,可以發信到[email protected]
本文配套源碼