• 初始化以及动态设置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被直接发送到目标窗口,从而导致窗口立即重绘。

  • 相关阅读:
    select into 和 insert into select 两种表复制语句
    hql to_number
    Oracle密码过期the password has expired解决办法
    SQL脚本修改表结构
    JSP -- EL表达式
    cascade属性
    FetchType与FetchMode的区别
    @OneToMany、@ManyToOne以及@ManyToMany讲解
    Jackson实现Object对象与Json字符串的互转
    Python 编码规范
  • 原文地址:https://www.cnblogs.com/sitemaker/p/2588377.html
Copyright © 2020-2023  润新知