如何个性控制对话框上的控件显示?涉及到这方面的知识实在太多,限于个人能力,我也不能在这里非常全面的介绍了,本文主要介绍日常最常用的几个功能:控件背景色设定、控件字体显示、控件字色显示、控件的亮\灰显示。而这里的控件,也主要就介绍静态控件、文本框控件、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.

      其实我这篇文章很粗浅的,但是我希望能起到一个抛砖引玉的作用,有高手看到了本文,把你的见解和更好的实现方法贴上来,供不会的朋友借鉴临摹一下。先在此感谢了!

漏了一点,就是显示控件的亮\灰控制,补上。(不好意思,见谅见谅)

加入控制ID为ID_MY_BUTTON的显示,
在本对话框类中实现用语句
GetDlgItem(ID_MY_BUTTON)->EnableWindow(false);
在非本对话框类中实现用语句
HWND Ctrlhwnd, dlghwnd;
GetDlgItem(IDD_BASE_DIALOG, &dlghwnd);
VERIFY(dlghwnd);
Ctrlhwnd = ::GetDlgItem(dlghwnd, ID_MY_BUTTON);
VERIFY(Ctrlhwnd);
::EnableWindow(Ctrlhwnd, true);