zoukankan      html  css  js  c++  java
  • 如何修改几种控件的颜色和字体

     http://www.360doc.com/content/10/0509/16/1393127_26805854.shtml 

               _ 360 如何改变控件的字体和字体颜色

    如何修改几种控件的颜色和字体

    设置控件颜色的主要目的是为了解决控件文字背景色不透明的问题。当向一个有背景色的界面上放置控件后,由于控件文字的背景色与界面背景色不符,使文字背后留下难看的灰块。现在我定义了可设置背景色和前景色的控件,只要使控件背景色与界面背景色相同,问题就解决了。

    设置控件颜色和字体时必须重载该控件对应的类,在其中加入相关的颜色控制和字体函数。各种控件的做法完全相同,只是重载的类不一样。

    注:对于静态文本控件(Static Text)、单选按钮(Radio Button)、复选按钮(Check Box)、组合框(Group Box)和编辑控件(Edit Box)都可以用相同的方法设置文字颜色和背景色,但这种方法对按钮(Button)无效,修改按钮的颜色和字体请参考文章:《可设置字体和颜色的按钮》。

    以静态文本控件(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;        //删除字体
    }

    这样一个可设置颜色和字体的静态文本类就定义好了。使用时先在对话框中加入静态文本控件,修改它的ID(注意:必须修改它的ID值,否则无法为它定义变量),然后用ClassWizard为它定义控制变量,把它的类型设置为CStaticEx;在对话框的OnInitDialog()函数中利用控件变量设置控件的颜色和字体就可以了。

    以上就是修改静态文本控件的颜色和字体的方法,其它控件的做法完全相同,只是对应的基类不同。

    单选按钮、复选按钮和组合框可以用 CButton类 作为基类生成新的扩展类 CButtonEx;编辑控件用 CEdit类作为基类生成扩展类 CEditEx。而CButtonEx类和CEditEx类的内容与上述的CStaticEx类完全相同,详见示例程序。

    在实际应用中,还有几个问题需要注意一下,一是单选按钮通常是成组使用的,用ClassWizard只能为一组单选按钮的第一个添加控制变量,其它的只能用手工加入。再就是添加组合框时也必须修改ID,否则无法定义变量。

    示例程序界面:

    本文所用MFC函数速查:
    CBrush::CreateSolidBrush
    CDC::Detach
    CDC::SetBkColor
    CDC::SetTextColor
    CFont::CreatePointFont
    CGdiObject::GetSafeHandle
    CWnd::SetFont

    快乐-奋斗
  • 相关阅读:
    翻译:关于Evaluation Stack
    beanshell 响应数据的解析与变量的保存
    nmon 采坑
    linux 防火墙管理
    服务器 安装docker (启动坑了很久才成功)docker-compose
    数据库负载均衡 happroxy 中间器(Nginx)容器的安装与配置
    docker 中搭建 mysql pxc 集群
    字节面试
    中缀表达式转为后缀表达式
    SpringBoot解决thymeleaf引入公共部分问题
  • 原文地址:https://www.cnblogs.com/tt-player/p/3927093.html
Copyright © 2011-2022 走看看