如何个性控制对话框上的控件显示?涉及到这方面的知识实在太多,限于个人能力,我也不能在这里非常全面的介绍了,本文主要介绍日常最常用的几个功能:控件背景色设定、控件字体显示、控件字色显示、控件的亮/灰显示。而这里的控件,也主要就介绍静态控件、文本框控件、check控件,按钮控件等。
众所周知,在VC中做界面几乎是所有工具中最艰难的一种(当然,如果是骨灰级的高手,那就变成“VC是做界面最丰富多彩的开发工具”了,我肯定离那境界还有好几个十万八千里!)。而VC中的界面,大多由对话框界面组成,所以包括本人在内,相信很多人都有感慨,要是VC的对话框能够随心所欲的定制该多好啊??在别的地方也看过一些换肤软件,总感觉不好使,当然,看到金山、瑞星那种界面就很向往了,可惜是只可YY想一下,就我个人而言,是不太可能一个人实现的。
言归正传,就我个人的使用和实践而言,在对话框中,不写派生类的情况下,可以简单实现一些控件的背景色、字体显示什么的属性,零零岁岁的装饰一下,也可以稍微美化一下我们自己的软件界面了。下面简单说明一下实现过程:
对话框中所有控件,着色显示都需要重载函数WM_CTRCOLOR,它一般生成OnCtrColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 成员函数,在这个里面实现几乎所有本文要说到的控件操作。
参数说明:pDC是设备指针;
pWnd是窗口指针;
nCtlColor是控件类型;
因为对话框中的每个控件都会响应一次该函数,所以一般情况下,要对某个控件操作,就要先通过语句
if (pWnd->GetDlgCtrlID() == IDC_STATIC_TITLE)
找到该控件,或者通过语句
if (nCtlColor == CTLCOLOR_BIN | nCtlColor == CTLCOLOR_TEXT);
找到控件类。
然后再通过设定设备环境来达到改变控件显示属性的目的。
改变控件显示字体,要先创建自己的特定字体,再选入设备
改变控件背景色,要先创建自己的特定画刷,再选入设备
改变控件显示字体的颜色,只要设置一下就可以了
下面用简单的例子来说明
1、
静态控件
这几乎是最简单的了,如果想改变某个ID为ID_MY_SEL_STATIC静态控件的背景色,只要语句
HBRUSH CViewWaveparamDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (pWnd->GetDlgCtrlID() == ID_MY_SEL_STATIC)
{
pDC->SetBkColor(RGB(0,0,255));//蓝色
pDC->SetBkMode(TRANSPARENT); //调用该语句主要是为了显示文本时,文本背景依然是蓝色
return ::CreateSolidBrush(RGB(98,176,255));//返回创建的画刷
}
return hbr;
}
如果想改变该控件的字体颜色,只需要在上面的函数if语句中加入一下语句就可以了
pDC->SetTextColor(RGB(255,255,255));//显示字体为白色
如果要改变控件的字体,则需要在对话框的初始函数中创建一个字体,最好用成员变量;然后把该字体选入特定的控件的设备环境中
GetObject(::GetStockObject(DEFAULT_GUI_FONT),sizeof(m_logfont),&m_logfont);
m_logfont.lfHeight = 16;
m_logfont.lfWeight = 16;
strcpy(m_logfont.lfFaceName, "黑体");
m_logfont.lfCharSet = GB2312_CHARSET;
VERIFY(m_Textfont.CreateFontIndirect(&m_logfont));
GetDlgItem(ID_MY_SEL_STATIC)->SetFont(&m_Textfont);
2、
文本控件、check控件等基本都是这样就可以实现了。
3、
按钮控件
我起初也像上面这样来做,可是就是显示出来不是那么回事,我查了很多书籍,才发觉,原来按钮用这个样子是做不出来的。必须派生类,从CButton派生。然后在派生类中重载函数OnDrawItem(),只有这样才能实现本文所述的功能。
涉及到派生,我想不是我三言两语能说清楚的,在此只是提个思路,恕在下无力!推荐个网上比较好的以后派生类CButtonST.
其实我这篇文章很粗浅的,但是我希望能起到一个抛砖引玉的作用,有高手看到了本文,把你的见解和更好的实现方法贴上来,供不会的朋友借鉴临摹一下。先在此感谢了!
众所周知,在VC中做界面几乎是所有工具中最艰难的一种(当然,如果是骨灰级的高手,那就变成“VC是做界面最丰富多彩的开发工具”了,我肯定离那境界还有好几个十万八千里!)。而VC中的界面,大多由对话框界面组成,所以包括本人在内,相信很多人都有感慨,要是VC的对话框能够随心所欲的定制该多好啊??在别的地方也看过一些换肤软件,总感觉不好使,当然,看到金山、瑞星那种界面就很向往了,可惜是只可YY想一下,就我个人而言,是不太可能一个人实现的。
言归正传,就我个人的使用和实践而言,在对话框中,不写派生类的情况下,可以简单实现一些控件的背景色、字体显示什么的属性,零零岁岁的装饰一下,也可以稍微美化一下我们自己的软件界面了。下面简单说明一下实现过程:
对话框中所有控件,着色显示都需要重载函数WM_CTRCOLOR,它一般生成OnCtrColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 成员函数,在这个里面实现几乎所有本文要说到的控件操作。
参数说明:pDC是设备指针;
pWnd是窗口指针;
nCtlColor是控件类型;
因为对话框中的每个控件都会响应一次该函数,所以一般情况下,要对某个控件操作,就要先通过语句
if (pWnd->GetDlgCtrlID() == IDC_STATIC_TITLE)
找到该控件,或者通过语句
if (nCtlColor == CTLCOLOR_BIN | nCtlColor == CTLCOLOR_TEXT);
找到控件类。
然后再通过设定设备环境来达到改变控件显示属性的目的。
改变控件显示字体,要先创建自己的特定字体,再选入设备
改变控件背景色,要先创建自己的特定画刷,再选入设备
改变控件显示字体的颜色,只要设置一下就可以了
下面用简单的例子来说明
1、
静态控件
这几乎是最简单的了,如果想改变某个ID为ID_MY_SEL_STATIC静态控件的背景色,只要语句
HBRUSH CViewWaveparamDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (pWnd->GetDlgCtrlID() == ID_MY_SEL_STATIC)
{
pDC->SetBkColor(RGB(0,0,255));//蓝色
pDC->SetBkMode(TRANSPARENT); //调用该语句主要是为了显示文本时,文本背景依然是蓝色
return ::CreateSolidBrush(RGB(98,176,255));//返回创建的画刷
}
return hbr;
}
如果想改变该控件的字体颜色,只需要在上面的函数if语句中加入一下语句就可以了
pDC->SetTextColor(RGB(255,255,255));//显示字体为白色
如果要改变控件的字体,则需要在对话框的初始函数中创建一个字体,最好用成员变量;然后把该字体选入特定的控件的设备环境中
GetObject(::GetStockObject(DEFAULT_GUI_FONT),sizeof(m_logfont),&m_logfont);
m_logfont.lfHeight = 16;
m_logfont.lfWeight = 16;
strcpy(m_logfont.lfFaceName, "黑体");
m_logfont.lfCharSet = GB2312_CHARSET;
VERIFY(m_Textfont.CreateFontIndirect(&m_logfont));
GetDlgItem(ID_MY_SEL_STATIC)->SetFont(&m_Textfont);
2、
文本控件、check控件等基本都是这样就可以实现了。
3、
按钮控件
我起初也像上面这样来做,可是就是显示出来不是那么回事,我查了很多书籍,才发觉,原来按钮用这个样子是做不出来的。必须派生类,从CButton派生。然后在派生类中重载函数OnDrawItem(),只有这样才能实现本文所述的功能。
涉及到派生,我想不是我三言两语能说清楚的,在此只是提个思路,恕在下无力!推荐个网上比较好的以后派生类CButtonST.
其实我这篇文章很粗浅的,但是我希望能起到一个抛砖引玉的作用,有高手看到了本文,把你的见解和更好的实现方法贴上来,供不会的朋友借鉴临摹一下。先在此感谢了!