• MFC窗口颜色的设置


    本文主要介绍对话框背景色以及控件颜色的设置(SetDialogBkColor()不再被支持)。

    对话框背景色的设置

    1、重载OnPaint()函数,即WM_PAINT消息,代码如下所示:

    void CtestDlg::OnPaint()
    {
        if (IsIconic())
        {
            CPaintDC dc(this); // 用于绘制的设备上下文
    
            SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
            // 使图标在工作区矩形中居中
            int cxIcon = GetSystemMetrics(SM_CXICON);
            int cyIcon = GetSystemMetrics(SM_CYICON);
            CRect rect;
            GetClientRect(&rect);
            int x = (rect.Width() - cxIcon + 1) / 2;
            int y = (rect.Height() - cyIcon + 1) / 2;
    
            // 绘制图标
            dc.DrawIcon(x, y, m_hIcon);
        }
        else
        {
            //CDialogEx::OnPaint();
    
            //设置为绿色背景
            CRect   rect; 
            CPaintDC   dc(this); 
            GetClientRect(rect); 
            dc.FillSolidRect(rect,RGB(0,255,0));  
        }
    }

    2、重载OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor),即WM_CTLCOLOR消息:

      a)在对话框的.h文件中添加CBrush类的成员m_brush

      b)在对话框的.cpp文件中的OnInitDialog()中添加以下代码(背景红色):

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

      c)重载OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor),代码如下:

    HBRUSH CtestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
        HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
    
        // TODO:  在此更改 DC 的任何特性
        
        if(nCtlColor == CTLCOLOR_DLG) 
            return   m_brush;   //返加红色刷子  
        
        // TODO:  如果默认的不是所需画笔,则返回另一个画笔
        return hbr;
    }

    控件颜色的设置

    重载OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor),即WM_CTLCOLOR消息:

    HBRUSH CtestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
        HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
    
        // TODO:  在此更改 DC 的任何特性
    
        // 设置显示字体
        CFont * font=new CFont;
        font->CreateFont(16,0,0,0,FW_SEMIBOLD,FALSE,FALSE,0,
            ANSI_CHARSET,OUT_DEFAULT_PRECIS,
            CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
            DEFAULT_PITCH&FF_SWISS,_T("Arial"));
    
        switch(nCtlColor)
        {
        case CTLCOLOR_STATIC: //对所有静态文本框的设置
            {
                pDC->SetBkMode(TRANSPARENT);
                //设置背景为透明
                pDC->SetTextColor(RGB(255,255,0)); //设置字体颜色
                pWnd->SetFont(font); //设置字体
                HBRUSH B = CreateSolidBrush(RGB(125,125,255));
                //创建画刷
                return (HBRUSH) B; //返回画刷句柄
            }
        case CTLCOLOR_EDIT: //对所有编辑框的设置
            {
                if(IDC_EDIT2 == pWnd->GetDlgCtrlID())
                {
                    pDC->SetBkMode(TRANSPARENT);
                    pDC->SetTextColor(RGB(255,255,0));
                    pWnd->SetFont(font);
                    HBRUSH B = CreateSolidBrush(RGB(125,125,125));
                    return (HBRUSH) B;
                }
                if(IDC_EDIT3 == pWnd->GetDlgCtrlID())
                {
                    pDC->SetBkMode(TRANSPARENT);
                    pDC->SetTextColor(RGB(255,0, 0));
                    pWnd->SetFont(font);
                    HBRUSH B = CreateSolidBrush(RGB(125,125,0));
                    return (HBRUSH) B;
                }
            }
        default:
            return CDialog::OnCtlColor(pDC,pWnd, nCtlColor);
        }
    
        // TODO:  如果默认的不是所需画笔,则返回另一个画笔
        return hbr;
    }

    注:

    nCtlColor的类别有以下几种:

    • CTLCOLOR_BTN  按钮控件
    • CTLCOLOR_DLG  对话框
    • CTLCOLOR_EDIT  编辑框
    • CTLCOLOR_LISTBOX  列表框
    • CTLCOLOR_MSGBOX   消息框
    • CTLCOLOR_SCROLLBAR  滚动条
    • CTLCOLOR_STATIC  静态文本
  • 相关阅读:
    启动一个线程是用run()还是start()? .
    多线程有几种实现方法?同步有几种实现方法?
    同步和异步有何异同,在什么情况下分别使用他们?举例说明。
    abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
    写clone()方法时,通常都有一行代码,是什么?
    解释Spring支持的几种bean的作用域。
    Spring结构?
    说说hibernate的三种状态之间如何转换?
    测试用例设计的原则是什么?目前主要的测试用例设计方法有哪些?
    一套完整的测试应该由哪些阶段组成?
  • 原文地址:https://www.cnblogs.com/gaohongchen01/p/4068743.html
Copyright © 2020-2023  润新知