标  题: 如何改变控件的颜色                               
发信人: Pacific (无情~~~Nolove), 信区: VisualC
发信站: BBS 水木清华站 (Fri Oct 16 17:17:39 1998)


    有两种方法。其一,可以在父类中指定控件的颜色,或者利用MFC4.0新的消息反       
射在控件类中指定颜色。                                                           
    当控件需要重新着色时,工作框调用父窗口(通常是对话框)的                     
CWnd: : OnCrtlColor,可以在父窗口类中重置该函数并指定控件的新的绘画属             
性。例如,下述代码将对话中的所有编辑控件文本颜色改为红色:                       
HBRUSH CAboutDig : : OnCtlColor (CDC * pDCM , CWnd * pWnd , UINT nCtlColor)      
                                                                                 
{                                                                                
    HBRUSH hbr = CDialog : : OnCtlColor (pDC, pWnd , nCtlColor );                
                                                                                 
    //Draw red text for all edit controls .                                      
    if (nCtlColor= = CTLCOLOR_EDIT )                                             
       pDC —> SetTextColor (RGB (255 , 0 , 0 , ) ) ;                            
                                                                                 
    return hbr ;                                                                 
}                                                                                
    然而,由于每个父窗口必须处理通知消息并指定每个控件的绘画属性,所以,         
这种方法不是完全的面向对象的方法。控件处理该消息并指定绘画属性更合情合理。       
    消息反射允许用户这样做。通知消息首先发送给父窗口,如果父窗口没有处理         
则发送给控件。创建一个定制彩色列表框控件必须遵循下述步骤。                       
    首先,使用ClassWizard 创建一个CListBox 的派生类并为该类添加下述数据          
成员。                                                                           
class CMyListBox ; publilc CListBox                                              
{                                                                                
…                                                                               
                                                                                 
private;                                                                         
    COLORREF m_clrFor ;     // foreground color                                  
    COLORREF m_clrBack ;   //background color                                    
    Cbrush m_brush ;         //background brush                                  
                                                                                 
…                                                                               
} ;                                                                              
    其次,在类的构造函数中,初始化数据中。                                       
CMyListBox : : CMyListBox ()                                                     
{                                                                                
    //Initialize data members .                                                  
    m_clrFore =RGB (255 , 255 , 0) ;   // yellow text                            
    m_clrBack=RGB (0 , 0 , 255) ;    // blue background                          
    m_brush . CreateSolidBrush  (m _clrBack );                                   
}                                                                                
    最后,使用ClassWizard处理反射的WM_CTLCOLOR(=WM_CTLCOLOR)消息并指定新         
的绘画属性。                                                                     
HBRUSH CMyListBox : : CtlColor (CDC* pDC, UINT nCtlColor )                       
{                                                                                
    pDC—>SetTextColor (m_clrFore);                                              
    pDC—>SetBkColor  (m_clrBack);                                               
                                                                                 
    return (HBRUSH) m_brush.GetSafeHandle ()                                     
}                                                                                
    现在,控件可以自己决定如何绘画,与父窗口无关。                               
                                                                                 
    
--
        老鸟有交待,中鸟要等待,菜鸟要忍耐。
        老鸟级功夫:吹牛、聊天、玩MUD 、发呆。
        中鸟级功夫:睡觉、灌水、玩游戏、NT&VC。
        菜鸟级功夫:学习、泡妞、玩篮球、And so on

        My E-Mail: Nolove@263.net

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: yazhou.bbs@bbs.net.t]
※ 修改:.fzx 于 Aug  9 16:51:14 修改本文.[FROM: heart.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.689毫秒