改变对话框和控件的背景及文本颜色

WM_CTLCOLOR,响应函数:CWnd::OnCtlColor

  afx_msg HBRUSH OnCtlColor(

    CDC* pDC,  //当前要绘制的控件的设备上下文的指针

    CWnd* pWnd,  //当前要绘制的控件的指针

    UINT nCtlColor  //要绘制的控件的类型

  );

1、改变整个对话框及其上子控件的背景色

  为程序的“设置”对话框CSettingDlg添加WM_CTLCOLOR命令消息及其消息响应函数:

    

  在对话框类CSettingDlg类中添加私有成员变量:CBrush m_brush,并在CSettingDlg类的构造函数中利用CreateSolidBrush函数将该画刷初始化为蓝色,然后更改消息响应函数OnCtlColor函数中返回的画刷句柄为该自定义的画刷句柄:

        

CSettingDlg::CSettingDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CSettingDlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CSettingDlg)
    m_brush.CreateSolidBrush(RGB(0,0,255));
    //}}AFX_DATA_INIT
}
HBRUSH CSettingDlg::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 hbr;
    return m_brush;
}

2、仅改变某个子控件的背景及文本颜色

  OnCtlColor函数的第二个参数pWnd可以表明当前绘制的控件是哪个,通过调用CWnd类的GetDlgCtrlID函数得到该控件的ID,若该ID为我们想要改变其背景的控件的ID,则更改OnCtlColor函数的返回画刷句柄为自定义的画刷句柄,否则返回默认画刷句柄;   

HBRUSH CSettingDlg::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
    if(pWnd->GetDlgCtrlID()==IDC_LINE_STYLE){
        return m_brush;
    }
    return hbr;
}

  若要改变控件上的文本颜色,须在OnCtlColor函数返回画刷句柄之前调用SetTextColor函数修改控件上的文本颜色:    

HBRUSH CSettingDlg::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
    //修改组框
    if(pWnd->GetDlgCtrlID()==IDC_LINE_STYLE){
        pDC->SetTextColor(RGB(255,0,0));  //修改文本颜色
        pDC->SetBkMode(TRANSPARENT);  //修改文本背景为透明
        return m_brush;
    }
    //修改编辑框
    if(pWnd->GetDlgCtrlID()==IDC_LINE_WIDTH){
        pDC->SetTextColor(RGB(255,0,0));  //修改编辑框中文本颜色
        pDC->SetBkColor(RGB(0,0,255));  //修改编辑框背景色
        return m_brush;
    }

    return hbr;
}

3、改变按钮控件的背景色及文本颜色

  若要改变按钮控件的文本颜色,需要自定义一个派生于CButton类的按钮类,并重写DrawItem虚函数,在此函数中实现按钮背景色和其上文本颜色的设置,然后将需要改变的按钮控件对象与这个自定义的按钮类相关联;

  在工程名上右击新建类:

  

  在该新建类上右击添加虚函数DrawItem,并在其中重写按钮绘制代码:

    

void CTestBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
    // TODO: Add your code to draw the specified item
    UINT uStyle=DFCS_BUTTONPUSH;
    ASSERT(lpDrawItemStruct->CtlType==ODT_BUTTON);
    if(lpDrawItemStruct->itemState & ODS_SELECTED){
        uStyle |= DFCS_PUSHED;
    }
    ::DrawFrameControl(lpDrawItemStruct->hDC,&lpDrawItemStruct->rcItem,DFC_BUTTON,uStyle);
    CString strText;
    GetWindowText(strText);
    COLORREF crOldColor=::SetTextColor(lpDrawItemStruct->hDC,RGB(255,0,0));
    ::DrawText(lpDrawItemStruct->hDC,strText,strText.GetLength(),&lpDrawItemStruct->rcItem,DT_SINGLELINE|DT_VCENTER|DT_CENTER);
    ::SetTextColor(lpDrawItemStruct->hDC,crOldColor);
    
}

  将“设置”对话框的【OK】按钮关联至新的自定义类的成员变量:

  

    会提示要在对话框的头文件中包含自定义类的头文件:

    #include "TestBtn.h"

  将对话框中【OK】按钮的属性样式中的“所有者绘制”勾选:

  

  运行程序,【OK】按钮的文本已经变成红色;若要改变按钮控件的背景色,须上网百度下载“CButtonST”类,将该类的头文件.h和源文件.cpp放到自己的工程文件夹中,在VC中将类的这两个文件添加到工程;为所要改的按钮控件添加关联的成员变量m_btnST,选择变量类名时没有“CButtonST”类,先随便选择一个,完成变量关联后到按钮所在对话框类的头文件中找到新增变量的定义,手动将其类型改为“CButtonST”,并在对话框头文件中包含“CButtonST”类的头文件;使用CButtonST类时无须更改按钮属性样式为“所有者绘制”;为对话框类添加WM_INITDIALOG消息的响应函数OnInitDialog,在该函数中将按钮的背景色和前景色初始化:

    m_btnST.SetActiveBgColor(RGB(0,0,255));  //活动状态的背景色

    m_btnST.SetActiveFgColor(RGB(255,0,0));  //活动状态的前景色

    m_btnST.SetInactiveBgColor(RGB(255,0,255));  //非活动状态的背景色

    m_btnST.SetInactiveFgColor(RGB(255,255,0));  //非活动状态的前景色

4、改变控件上的文本字体

  为程序对话框资源添加一个静态文本控件,ID为IDC_TEXT,在程序中修改该控件的文本;

  先为对话框类CSettingDlg类添加私有成员变量:CFont m_font,并在CSettingDlg类的构造函数中将其初始化:

        

CSettingDlg::CSettingDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CSettingDlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CSettingDlg)
    m_font.CreatePointFont(200,"黑体");
    //}}AFX_DATA_INIT
}

  在CSettingDlg类的OnCtlColor函数中判断当前绘制的若为静态文本控件,则将自定义的字体选入设备描述表中,该控件的文本即以新字体显示:  

HBRUSH CSettingDlg::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

    if(pWnd->GetDlgCtrlID()==IDC_TEXT){
        pDC->SelectObject(&m_font);
    }

    return hbr;
}
时间: 2024-11-11 04:08:12

改变对话框和控件的背景及文本颜色的相关文章

VS2010/MFC对话框:为对话框添加控件)

为对话框添加控件 创建对话框资源需要创建对话框模板.修改对话框属性.为对话框添加各种控件等步骤,前面一讲中已经讲了创建对话框模板和修改对话框属性,本节继续讲如何为对话框添加控件. 上一讲中创建了一个名为“Addition”的工程,目的是生成一个实现加法运算的应用程序.实现加法计算有几个必要的因素:被加数.加数.和.被加数和加数需要输入,和需要输出显示.那么这几个因素都需要相应的控件来输入或显示,下面鸡啄米就一步步讲解如何添加这些控件. 1.为对话框添加一个静态文本框(Static Text),用

【转】MFC对话框和控件

原文网址:http://www.cnblogs.com/tiwlin/archive/2013/05/08/3067966.html 对话框和控件 对话框是Windows应用程序中一种常用的资源,其主要功能是输出信息和接收用户的输入数据.控件是嵌入在对话框中或其它父窗口中的一个特殊的小窗口,它用于完成不同的输入.输出功能.对话框与控件关系密切,在每个对话框上一般都有一些控件,对话框依靠这些控件与用户进行信息的交互. 在MFC中,对话框的功能被封装在CDialog类中,而CDialog类是CWnd

Android中设置控件的背景颜色的方式整理

版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 在Android开发中,经常需要设置控件的背景颜色或者图片的src颜色. 效果图 代码分析 根据使用的方法不同,划分为 setBackgroundColor方法[一般用于RelativeLayout.TextView等控件] 使用colors.xml文件中的颜色 使用颜色的int类型值 使用颜色的16进制类型值 setImageDrawable方法[一般用于ImageView控件] 使用colors.xml文件中的颜色 使用颜色的int

代码方式给控件添加背景图片(WPF)

wpf中常常需要给控件添加背景图片,下边以wrapPanel为例,使用代码添加背景图片 WrapPanel xwraPanel = new WrapPanel(); ImageBrush ximgBrush = new ImageBrush(); Uri xuri = new Uri("pack://application:,,,/Images/JXimgs/MeterLayout.png", UriKind.Absolute); //注意这个的写法 ximgBrush.ImageSo

PrimeFace JSF中使用ajax控件无法实时更新文本框inputTextarea内容

PrimeFace+JSF实际工作需要点击一个树将关联的文本添加到inputTextarea文本框,inputTextarea允许用户随意更改,ajax绑定树的select事件,但点击时,后台Bean对象无法实时获取前台文本框改变的实际内容. 原因估计ajax控件无法将前台文本框数据关联到后台. 解决方案: 添加一个按钮和文本框鼠标事件,事件JS调用按钮click事件,由按钮将文件夹数据同步到后台. 前台代码: <script> function callButton(){ document.

c#winform中如何修改ListView控件每个单元格的颜色

ListView在View属性为Details的时候它呈现的方式和DataGirdView差不多,它的每一行都是一个ListViewItem,然而每个ListViewItem都有一个BackColor的属性,但是设置了这个属性却没有任何作用.因为是ListView的每一行的样式都继承的父控件的样式所以无法改变. 解决方案: ListViewItem item; item = new ListViewItem(new string[] { "NAME","" });

(转)TextView 设置背景和文本颜色的问题

在做一个项目,突然遇到如下问题 比如:在color.xml中定义了几个颜色 <color name="white">#FFFFFF</color> <color name="orange">#DF8326</color> 复制代码 又给TextView 设置了字体颜色和背景色 <TextView android:id="@+id/hello" android:textColor="@

MFC 学习之 模态对话框图片控件上作图

首先说明一点,onpaint 是更新面板用的,作图的话应在控件上进行. 新建 MFC 对话框工程,面板上添加按钮 IDC_START , IDC_SHOW , IDC_STOP 添加两个对话框,ID 分别设为(简写)ld 和 cd. ld 上添加三个图片控件,并且每一个均关联一个 CSTATIC 型变量. cd 上添加一个图片控件,操作如上. 分别为两个对话框添加类,名称自己设,我的是 CLineDlg 和 CCompDlg . 主对话框头文件中包含两个类的头文件. 添加声明: CLineDlg

Windows Phone开发中,减小(改变)Pivot控件PivotItem的Header(标题)字号

Pivot,枢轴控件在WP中很常见,比如QQ.自带的照片(WP8.1中)使用的就是这种控件和布局,Pivot中可以包含若干个PivotItem(枢轴项),每个PivotItem可以理解为一个子页面,PivotItem中有Header属性,用来设置PivotItem的标题. 但是,这个Header默认居然不能设置字号!默认的个人认为太大,占据屏幕空间太多,至少在本人之前写的一个应用中需要缩小Header的字号. 百度.谷歌了一大圈,纠结几天时间,终于找到一种改变Header字号的方法. 首先看xa