`
huozheleisi
  • 浏览: 1235859 次
文章分类
社区版块
存档分类
最新评论

如何修改几种控件的颜色和字体

 
阅读更多

设置控件颜色的主要目的是为了解决控件文字背景色不透明的问题。当向一个有背景色的界面上放置控件后,由于控件文字的背景色与界面背景色不符,使文字背后留下难看的灰块。现在我定义了可设置背景色和前景色的控件,只要使控件背景色与界面背景色相同,问题就解决了。

设置控件颜色和字体时必须重载该控件对应的类,在其中加入相关的颜色控制和字体函数。各种控件的做法完全相同,只是重载的类不一样。

注:对于静态文本控件(Static Text)、单选按钮(Radio Button)、复选按钮(Check Box)、组合框(Group Box)和编辑控件(Edit Box)都可以用相同的方法设置文字颜色和背景色,但这种方法对按钮(Button)无效,修改按钮的颜色和字体请参考文章:《可设置字体和颜色的按钮》。

以静态文本控件(Static Text)为例:

①用ClassWizard添加新类,基类选为CStatic,新类名称设为CMyStatic。
②在CStatic类中,用ClassWizard重载消息“=WM_CTLCOLOR”的函数CtlColor(),注意:不要错误地重载名为“WM_CTLCOLOR”的消息,若重载了它会得不到想要的效果。
③在CtlColor()函数中修改控件的背景色和文本颜色。
④加入设置颜色和字体的接口函数。

以下为CStatic类的相关部分:

在 MyStatic.h 中加入变量和接口函数的定义:

private:
COLORREFm_ForeColor;//文本颜色
COLORREFm_BackColor;//背景色
CBrushm_BkBrush;//背景刷
CFont*p_Font;//字体

//接口函数
public:
voidSetForeColor(COLORREFcolor);//设置文本颜色
voidSetBkColor(COLORREFcolor);//设置背景颜色
voidSetTextFont(intFontHight,LPCTSTRFontName);//设置字体

在 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)deletep_Font;//删除字体
}

这样一个可设置颜色和字体的静态文本类就定义好了。使用时先在对话框中加入静态文本控件,修改它的ID(注意:必须修改它的ID值,否则无法为它定义变量),然后用ClassWizard为它定义控制变量,把它的类型设置为CStaticEx;在对话框的OnInitDialog()函数中利用控件变量设置控件的颜色和字体就可以了。

以上就是修改静态文本控件的颜色和字体的方法,其它控件的做法完全相同,只是对应的基类不同。

单选按钮、复选按钮和组合框可以用 CButton类 作为基类生成新的扩展类 CButtonEx;编辑控件用 CEdit类 作为基类生成扩展类 CEditEx。而CButtonEx类和CEditEx类的内容与上述的CStaticEx类完全相同,详见示例程序。

在实际应用中,还有几个问题需要注意一下,一是单选按钮通常是成组使用的,用ClassWizard只能为一组单选按钮的第一个添加控制变量,其它的只能用手工加入。再就是添加组合框时也必须修改ID,否则无法定义变量。

示例程序界面:

示例程序界面

本文所用MFC函数速查:
CBrush::CreateSolidBrush
CDC::Detach
CDC::SetBkColor
CDC::SetTextColor
CFont::CreatePointFont
CGdiObject::GetSafeHandle
CWnd::SetFont

http://221.199.150.103/jsj/Html/vc/wen/vcwen01.htm
分享到:
评论

相关推荐

    修改几种控件的颜色和字体

    C++ MFC ControlColor 修改几种控件的颜色和字体

    TEST修改几种控件的颜色和字体

    一个可以修改几种控件的颜色和字体的测试demo,欢迎下载使用,特别适合新手!我也是转载的资源共享啊,希望原作者不要骂我啊!

    Delphi 十六进制编辑控件 HexWin (xe10.3可用)

    十六进制编辑器控件... 注:如果该控件在使用其它字体时显示不正常,需将控件 字体的字符集修改为 Font->Charset=GB2312_CHARSET 才能正常显示,默认用 Courier New 字体, 12 字号, 字符集 ANSI_CHARSET 最为美观 }

    Delphi专业 界面 控件Skin++ For Delphi (一)

    第三种,颜色和文字混合的平滑型进度条,文字可以准备显示当前进度值。 第四种,纯颜色的渐变型进度条。 以上四种效果是通过Skin++ Builder 来进行设计的。可以根据美术人员的创意进行更多风格的设计。

    csXGraph OCX控件

    csXGraph OCX控件 用于绘画圆形统计图表,条形统计... <br> csXGraph OCX控件的几种统计图表如下: <br> <img border="0" src=DownloadFilesgrid_activeximagescsxgraph_1.gif width="290" height="200"> ...

    Visual C++ 编程资源大全(控件 窗体)

    freemenu.zip 随意设定颜色和字体的自绘菜单(35KB)<END><br>15,menutip.zip 实现菜单的工具提示演示程序(33KB)<END><br>16,dockmenubar_src.zip DevStudio样式的泊位菜单条(不用MSIE)(27KB)<END><br>17,...

    VB编程资源大全(控件 窗体1)

    asbubble01.zip 几个特殊的控件,可以在程序里弹出类似于气泡的对话框(37KB) 49,formshaper.zip 无需再调用api,利用这个控件你可以把窗体设计成为任意的形状(18KB) 50,devporbu.zip 建立如同out ...

    VB编程资源大全(控件 窗体2)

    asbubble01.zip 几个特殊的控件,可以在程序里弹出类似于气泡的对话框(37KB) 49,formshaper.zip 无需再调用api,利用这个控件你可以把窗体设计成为任意的形状(18KB) 50,devporbu.zip 建立如同out ...

    皮肤控件研究文档,破解后的库文件,皮肤设计工具使用教程

    可以通过以下几种方式来判断界面库类产品的效率:  拖拽窗口,观察是否有明显的停顿感。 可在一个系统下,找一些知名软件比较,如QQ/MSN等。如果有明显差异,则说明界面库在界面的绘制等方面存在欠缺。  拖拽...

    Delphi 专业 界面 控件 Skin++ For Delphi(二)

    第三种,颜色和文字混合的平滑型进度条,文字可以准备显示当前进度值。 第四种,纯颜色的渐变型进度条。 以上四种效果是通过Skin++ Builder 来进行设计的。可以根据美术人员的创意进行更多风格的设计。

    ZedGraph winform打印 统计报表 打印组建 统计组件.NET2.0

    图片的保存路径设置:RenderedImagePath属性中设置,程序对该文件夹应该是有写和修改权限的 图片的输出格式:OutputFormat属性中设置,Png的推荐,比较清晰。 Chart ChartBorder 图表区域的边框设置 ChartFill 图表...

    ZedGraph控件属性及基础教程详解(2003)

    图片的保存路径设置:RenderedImagePath属性中设置,程序对该文件夹应该是有写和修改权限的 图片的输出格式:OutputFormat属性中设置,Png的推荐,比较清晰。 Chart ChartBorder 图表区域的边框设置 ChartFill ...

    Visual C++2010开发权威指南.part02

    5.4.11 更改列表控件样式 206 5.4.12 虚拟列表控件 207 5.4.13 列表控件的消息映射 209 5.4.14 列表控件的风格选项及表头 5.4.14 设置 210 5.4.15 销毁列表控件 210 5.5 Visual C++ 2010 Edit控件简介与 5.5 开发 ...

    Visual C++2010开发权威指南(共三部分).part1.rar

    5.23.1 使用MFC方法定制控件必备的几个基本概念 259 5.23.2 定制自定义控件的3种常见方法 260 5.24 Visual C++ 2010 SysLink控件简介与开发 260 5.25 Visual C++ 2010 Split Button控件简介与开发 261 5.26 Visual ...

    中南大学计算机程序设计课程设计(C++)(MFC).zip

    首先介绍了阶乘计算、三角形计算器、字体设置、素数计算、填充园颜色改变等程序功能,其次对基于对话框和基于视图结构的设计思想和过程进行解释,详细地指出控件、消息响应函数、对话框类的作用及图片插入等制作方法...

    AutoPlay_Menu_Builder6.0.1328注册版

    选定一种控件,然后点击设计窗口中的目标位置,或者在设计窗口中按下鼠标画出一个目标矩形,就可以在设计窗口中添加一个新控件。  如果需要添加多个相同类型的控件,可以在选定控件类型时按住 SHIFT 键。这样,当...

    AutoPlay_Menu_Builder5.5.0.1328注册版

    选定一种控件,然后点击设计窗口中的目标位置,或者在设计窗口中按下鼠标画出一个目标矩形,就可以在设计窗口中添加一个新控件。  如果需要添加多个相同类型的控件,可以在选定控件类型时按住 SHIFT 键。这样,当...

    Visual C++ 编程资源大全(源码 控件)

    这个类已经替你做好了,它可是有正常、平面、下推几种风格的,快使用它吧(25KB)<END><br>4,TransBut.zip 实现背景透明的按钮类(306KB)<END><br>5,AviButton.zip 这个类库可以在按钮上显示AVI动画,很酷的(68KB...

    VC++2010权威开发指南+源代码

     5.23.1 使用MFC方法定制控件必备的几个基本概念 259  5.23.2 定制自定义控件的3种常见方法 260  5.24 Visual C++ 2010 SysLink控件简介与开发 260  5.25 Visual C++ 2010 Split Button控件简介与开发 261  ...

Global site tag (gtag.js) - Google Analytics