以靜態文本控件(Static Text)為例:
//以上為初始化
①用ClassWizard添加新類,基類選為CStatic,新類名稱設為CMyStatic。
②在CStatic類中,用ClassWizard重載消息“=WM_CTLCOLOR”的函數CtlColor(),注意:不要錯誤地重載名為“WM_CTLCOLOR”的消息,若重載了它會得不到想要的效果。
③在CtlColor()函數中修改控件的背景色和文本顏色。
④加入設置顏色和字體的接口函數。
以下為CStatic類的相關部分:
在 MyStatic.h 中加入變量和接口函數的定義:
private:
COLORREF m_ForeColor; //文本顏色
COLORREF m_BackColor; //背景色
CBrush m_BkBrush; //背景刷
CFont* p_Font; //字體
// 接口函數
public:
void SetForeColor(COLORREF color); //設置文本顏色
void SetBkColor(COLORREF color); //設置背景顏色
void SetTextFont(int FontHight,LPCTSTR FontName); //設置字體
在 MyStatic.cpp 中加入以下內容:
在構造函數中,設置變量的初值
CStaticEx::CStaticEx()
{
m_ForeColor = RGB(0,0,0); //文字顏色(黑色)
m_BackColor = RGB(255,255,255); //背景色(白色)
m_BkBrush.CreateSolidBrush(m_BackColor); //背景刷
p_Font = NULL; //字體指針
}
用ClassWizard重載消息“=WM_CTLCOLOR”(注:不是WM_CTLCOLOR),在其中修改控件的前景色和背景色:
HBRUSH CStaticEx::CtlColor(CDC* pDC, UINT nCtlColor)
{
pDC->SetTextColor( m_ForeColor ); //設置文字顏色
pDC->SetBkColor( m_BackColor ); //設置背景色
return (HBRUSH)m_BkBrush.GetSafeHandle(); //返回背景刷
}
另外,為方便調用,再定義三個接口函數:
//設置控件文字顏色
void CStaticEx::SetForeColor(COLORREF color)
{
m_ForeColor = color; //設置文字顏色
}
//設置控件背景顏色
void CStaticEx::SetBkColor(COLORREF color)
{
m_BackColor = color;
m_BkBrush.Detach(); //分離原背景刷
m_BkBrush.CreateSolidBrush( m_BackColor ); //建立背景刷
}
//設置控件字體
void CStaticEx::SetTextFont(int FontHight,LPCTSTR FontName)
{
if ( p_Font ) delete p_Font; //刪除舊字體
p_Font = new CFont; //生成字體對象
p_Font->CreatePointFont( FontHight, FontName ); //創建字體
SetFont( p_Font ); //設置控件字體
}
其中FontHight為字體高度,FontName為字體名。
由於新字體由new生成,必須顯式回收,這項工作可以在CMyButton類的析構函數中進行:
CStaticEx::~CStaticEx()
{
if ( p_Font ) delete p_Font; //刪除字體
}
//動態改變
void CTestColorDlg::OnBnClickedChangebkg()
{
// TODO: 在此添加控件通知處理程序代碼
CColorDialog dlg;
if(dlg.DoModal()==IDOK)
{
textclor=dlg.GetColor();
m_static1.SetBkColor(textclor);
m_static1.SetRedraw(TRUE);
// invalidate the entire control, force painting
m_static1.Invalidate();
m_static1.UpdateWindow();
}
}
Invalidate:
該函數的作用是使整個窗口客戶區無效。窗口的客戶區無效意味着需要重繪,例如,如果一個被其它窗口遮住的窗口變成了前台窗口,那么原來被遮住的部分就是無效的,需要重繪。這時Windows會在應用程序的消息隊列中放置WM_PAINT消息。MFC為窗口類提供了WM_PAINT的消息處理函數OnPaint,OnPaint負責重繪窗口。視圖類有一些例外,在視圖類的OnPaint函數中調用了OnDraw函數,實際的重繪工作由OnDraw來完成。參數bErase為TRUE時,重繪區域內的背景 將被擦除,否則,背景將保持不變。
InvalidateRect():
該函數的功能與Invalidate基本一樣,不同的是,它是使指定的某個區域無效,需要輸入一個區域。
UpdateWindow():
UpdateWindow( )的作用是使窗口立即重繪。調用Invalidate等函數后窗口不會立即重繪,這是由於WM_PAINT消息的優先級很低,它需要等消息隊列中的其它消息發送完后才能被處理。調用UpdateWindow函數可使WM_PAINT被直接發送到目標窗口,從而導致窗口立即重繪。
