初始化以及動態設置Edit控件的背景及字體顏色


以靜態文本控件(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被直接發送到目標窗口,從而導致窗口立即重繪。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM