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

  • 相关阅读:
    POJ2778 DNA Sequence AC自动机上dp
    codeforces732F Tourist Reform 边双联通分量
    codeforces786B Legacy 线段树优化建图
    洛谷P3588 PUS 线段树优化建图
    codeforces1301D Time to Run 模拟
    codeforces1303B National Project 二分或直接计算
    codeforces1303C Perfect Keyboard 模拟或判断欧拉路
    codeforces1303D Fill The Bag 二进制应用+贪心
    python之路——使用python操作mysql数据库
    python之路——mysql索引原理
  • 原文地址:https://www.cnblogs.com/sitemaker/p/2588377.html
Copyright © 2011-2022 走看看