改变对话框 view背景色

本文介绍如何使用Visual C++修改MDI主窗口及其视图和对话框的背景颜色。通过处理WM_ERASEBKGND消息并自定义画刷,可以轻松实现背景色的更换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

改变MDI客户窗口背景的方法      

          其实,VC6.0/5.0在其MSDN   Library中已经对修改MDI主窗口的客户区背景提  

  供了方法,并给出了示例。  

          先介绍一下Windows实现窗口背景刷新的标准方法,是通过处理WM_ERASEBKGND消  

  息来实现的。下面的示范代码显示了它是怎么做的。  

        BOOL   CSampleView::OnEraseBkgnd(CDC*   pDC)  

        {  

              //   设置画刷为希望的背景色  

              CBrush   backBrush(RGB(255,   128,   128));  

              //   保存旧画刷  

              CBrush*   pOldBrush   =   pDC-   >SelectObject(&backBrush);  

              CRect   rect;  

              pDC-   >GetClipBox(&rect);  

              //   擦除需要的区域  

              //   用创建的画刷绘制背景区域  

              pDC-   >PatBlt(rect.left,   rect.top,   rect.Width(),   rect.Height(),  

                      PATCOPY);  

              pDC-   >SelectObject(pOldBrush);  

              return   TRUE;  

        }  

  要改变MDI主窗口的客户区背景,我们还需要做一些额外的工作:要先Subclass   MDI  

  主窗口的客户区子窗口,然后再处理WM_ERASEBKGND消息。  

    我们可以通过执行以下步骤来示范如何修改MDI主窗口的客户区背景:  

    1.用ClassWizard创建一个基类为CWnd的窗口类,可以命名为CNewClientWnd。  

    2.在CMainFrame中添加类型为上一步创建的窗口类CNewClientWnd的成员变量,可以  

  命名为m_wndNewClient。  

3.在CMainFrame的成员函数OnCreate中,对基类  CMDIFrameWnd::OnCreate()的调用之后,添加一条对SubClassWindow()的调用语句。  

                if   (!m_wndNewClient.SubclassWindow(m_hWndMDIClient))  

                {  

                    TRACE("Failed   to   subclass   MDI   client   window/n");  

                    return   -1;             //   fail   to   create  

                }  

    m_hWndMDIClient是CMDIFrameWnd的成员变量,包含了MDI客户窗口的句柄。  

    注意:(通过Help来查阅CMDIFrameWnd的成员变量,你是找不到m_hWndMDIClient的)  

    4.使用开始的示范代码来处理第一步创建的窗口类CNewClientWnd的WM_ERASEBKGND消息。改变主窗口的背景颜色.      

    5.要子窗口的背景,请按最前面的方法做.     

  如何改变视图的背景色        

        Visual   C++提供的View视图的背景一般都是白色,而FormView是灰色,如何才能改成自己喜欢的颜色呢?    

Visual   C++的窗口一般都会接收到一个WM_ERASEBGRN消息,窗口通过响应这个消息对背景区域进行刷新.假设应用程序的视图类的名称为:CMy13View,要改变背景,请按下面的步骤来;      

 1.在My13View.h中添加下面的代码:      

            afx_msg   BOOL   OnEraseBkgnd(CDC   *pDC);//该行代码加在//}AFX_MSG行的前面.      

 2.在My13View.h中添加两个成员变量:      

            COLORREF   m_crBackground;  

            CBrush   m_wndbkBrush;      

            其中,m_crBackground是颜色值,用来创建背景刷子;m_wndbkBrush是填充背景区域的刷子.   

 3.在My13View.cpp中,添加消息映射.      

            ON_WM_ERASEBKGND()//加在//}AFX_MSG_MAP行之前     

 4.在CM13View的构造函数中,添加下面的代码,对刷子进行初始化:      

            m_crBackground=RGB(0,0,255);//想要改成的颜色      

            m_wndbkBrush.CreateSolidBrush(m_crBackground);     

 5.在My13View.cpp中,添加下面的代码:      

            BOOL   CMy13View::OnEraseBkgnd(CDC   *pDC)  

            {  

                    CView::OnEraseBkgnd(pDC);//这里要看CMy13View的基类是什么就用哪个类.  

                    CRect   rect;  

                    GetClientRect(rect);  

                    pDC->FillRect(&rect,&m_wndbkBrush);  

                    return   TRUE;  

              }      

   6.以上已经修改了视的背景.但是,文字的背景还得设置,这就要在文本输出前调用CDC类的SetBKColor函数即可.如果想要透明输出,调用CDC的SetBKMode函数,将背景模式设置为TRANSPARENT就可以了!    

 void   CView1::OnDraw(CDC*   pDC)  

  {  

  CRect   rc;  

  GetClientRect(rc);  

  //背景为黑色  

  pDC->FillSolidRect(0,   0,   rc.Width(),   rc.Height(),   RGB(0,   0,   0));  

  //黑底绿字  

  pDC->SetBkColor(RGB(0,   0,   0));  

  pDC->SetTextColor(RGB(0,   255,   0));  

  }  

  如何改变对话框的背景色        

        Visual   C++提供的对话框的背景一般都是灰色,如何才能改成自己喜欢的颜色呢?请跟我来!    

        1.在对话框头文件中定义一个成员变量CBrush   m_brush;       

        2.添加如下代码到OnInitDialog函数中:        

              m_brush.CreateSolidBrush(RGB(255,255,255));        

        3.重载WM_CTLCOLOR消息处理函数,将值返回为m_brush.    

              HBRUSH   CMy131Dlg::OnCtlColor(CDC*   pDC,   CWnd*   pWnd,   UINT   nCtlColor) 

              {  

                        //HBRUSH   hbr   =   CDialog::OnCtlColor(pDC,   pWnd,   nCtlColor);     

                        //   TODO:   Change   any   attributes   of   the   DC   here     

                 //   TODO:   Return   a   different   brush   if   the   default   is   not   desired  

                        return   m_brush;  

                }    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值