VC中改变窗体及控件的颜色

发表于:2007-07-04来源:作者:点击数: 标签:
孟学桢 一般情况下,VC中的对话框及控件的颜色大都是灰色的,但一个良好的应用程序,它的界面都是丰富多彩的,那么在VC中怎样实现窗体及控件的着色呢? 改变窗体的颜色 要改变一个对话框的背景色,可以调用CWin::SetDialogBkColor,它可以改变所有的对话框的颜色
孟学桢

  一般情况下,VC中的对话框及控件的颜色大都是灰色的,但一个良好的应用程序,它的界面都是丰富多彩的,那么在VC中怎样实现窗体及控件的着色呢?


  改变窗体的颜色


  要改变一个对话框的背景色,可以调用CWin::SetDialogBkColor,它可以改变所有的对话框的颜色。第一参数指定了背景颜色,第二参数指定了文本颜色。

  用法如下:

  BOOL CSampleApp::InitInstance()

  {

  ...

  //set yellow dialog and green text

   SetDialogBkColor(RGB(255,255,0),RGB(0,255,0));

  ...

  }

  需要重画对话框(或对话框的子控件)时,Windows向对话框发送消息WM—CTLCOLOR。通常用户可以让Windows选择绘画背景的刷子,也可以重置该消息指定刷子。下面的说明创建了一个红色背景对话框的步骤。

  首先,给对话框基类增加一个成员变量。

  class CMyFormView::public CFormView

  {

  ...

  private:

   CBrush m—brush ; //background brush

  ...

  };

  其次,在类的构造函数中将刷子初始化为所需的背景颜色。

  CMyFormView::CMyFormView()

  {

  // Initialize background brush

   m—brush.CreateSolidBrush(RGB(255,0,0));

  }

  最后,使用ClassWizard处理WM—CTLCOLOR消息并返回一个用来绘画对话框背景的刷子句柄。由于重画对话框控件时也要调用该函数,所以要检测nCtlColor参量。

  HBRUSH CMyFormView::OnCtlColor()

  {

  //determine if drawing a dialog box,

  //otherwise let windows handle it

  if(nCtlColor==CTLCOLOR—DLG)

  return (HBRUSH) m—brush.GetSafeHandle();

  return CFormView::OnCtlColor(pDC,pWnd,nCtlColor);

  }


  改变控件的颜色


  需要改变控件的颜色,可以通过两种方法,其一,可以在父类中指定控件的颜色。其二,利用消息反射在控件类中指定颜色。

  当控件需要重新着色时,工作框调用父窗口(通常是对话框)的CWnd::OnCtlColor,可以在父窗口类中重置该函数并指定新的绘画属性。

  如下所示,将对话框中的编辑控件的文本颜色改为蓝色。

  HBRUSH CMyDialog::OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor)

  {

  HBRUSH hbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);

  //Draw blue text for edit controls

  if(nCtlColor==CLTCOLOR—EDIT)

  pDC->SetTextColor(RGB(0,0,255));

  return hbr;

  }

  由于每个窗口必须处理通知消息并指定每个控件的绘画属性,所以,这种方法不是完全的面向对象的方法,控件处理该消息并指定绘画属性更合理一些。

  消息反射允许用户这样做,通知消息发给父窗口,若父窗口没有处理则发给控件,创建一个定制彩色列表框控件,其步骤如下。

  首先用ClassWizard创建一个CListBox的派生类,并添加如下的成员变量。

  class CMyListBox::public CListBox

  {

  ...

  private :

  COLORREF m—clrFore; //foreground color

  COLORREF m—clrBack; //background color

  CBrush m—brush ; //background brush

  ...

  };

  其二,在类的构造函数中初始化数据成员。

  CMyListBox::CMyListBox()

  {

  //Initialize data members

  m—clrfore=RGB(255,0,0); //red text

  m—clrBack=RGB(0,255,0);

  //green background

  m—brush.CreateSolidBrush(m—clrBack);

  }

  第三,使用ClassWizard处理反射消息(=WM—CTLCOLOR)并指定新的绘画属性。

  HBRUSH CMyListBox::CtlColor(CDC* pDC,UINT nCtlColor)

  {

  pDC->SetTextColor(m—clrFore);

  pDC->SetBkColor(m—clrBack);

  return (HBRUSH)m—brush.GetSafeHandle();

  }

  现在控件可以重画自身,与父窗口无关。

  最后,在父窗口头文件中包含派生的CMyListBox类,然后用ClassWizard 定义列表框控件的成员变量即可。其成员变量的类性为CMyListBox。 这样我们就完成了控件的着色。   

原文转自:http://www.ltesting.net