对话框及其控件颜色设置

来源:百度文库 编辑:神马文学网 时间:2024/04/29 17:33:06
要改变对话框的一般颜色,可以在C***App的InitInstance函数里加入如下代码:SetDialogBkColor(RGB(0,255,255),RGB(255,0,0));//背景青蓝、文字红色
  但是这样不能改变对话框中的图形控件的颜色;
  每个控件在dialog中都是一个窗口,当要绘制控件时,会发出一个WM_CTLCOLOR消息给它的父窗口(对话框本身).消息映射及响应函数如下:
  ON_WM_CRLCOLOR() //反映WM_CTLCOLOR消息
  afx_msg HBRUSH CWnd::OnCrlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor);
  //
  nCtlColor类型:
  CTLCOLOR_DLG对话框本身,不含有所有的控件
  CTLCOLOR_STATIC 所有包含static text控件的设置(也包括无效的edit box、combo box的eidt box)
  CTLCOLOR_EDIT edit box与combo box的eidt box部分
  CTLCOLOR_LIST list box与combo box的edit box部分
  CTLCOLOR_SCROLLBAR Scroll bar的空白区
  我们也可以单独改变某一个控件的颜色.OnCtrlColor函数的pWnd成员变量是各控件的窗口指针,以pWnd->GetDlgCtrlID()可以获得调用此函数的控件ID,将它与已知ID比较,就可以改变这个控件的颜色。
  if(pWnd->GetDlgCtrlID() ==IDC_CONTROL)//为控件的ID
  {
  //pDC->SetBkColor(RGB(255, 0, 0)); -----------在这里也用上了这种写法。不行的,
  }
  另外一个作法是比较pWnd;例如:如果一个edit box控件的成员变量m_edit1被声明为CEdit类,那么把m_edit1.m_hWnd与pWnd->m_hWnd比较,也可以知道是哪个控件.
  下面是一个例子:
  HBRUSH CDIALOGDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
  {
   HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
   // TODO: Change any attributes of the DC here
   if(nCtlColor==CTLCOLOR_EDIT)
   pDC->SetTextColor(RGB(0,0,255)); 
   if(nCtlColor== CTLCOLOR_LISTBOX)
   {
   HBRUSH m_hbrush;
   m_hbrush=CreateSolidBrush(RGB(0,0,0));
   pDC->SetBkMode(TRANSPARENT);
   //设置字体颜色
   pDC->SetTextColor(RGB(255,255,255));
   return m_hbrush;
   }
   CBrush m_cBrush;
   m_cBrush.CreateSolidBrush(RGB(0,255,255));
   switch(nCtlColor)
   {
   case CTLCOLOR_DLG:
   pDC->SetBkMode(TRANSPARENT);
   
  break;
   case CTLCOLOR_STATIC:
   pDC->SetTextColor(RGB(255,0,0));
   pDC->SetBkColor(RGB(0,255,255)); 
   
  break;
   }
   DeleteObject(m_cBrush);
   // TODO: Return a different brush if the default is not desired
   return hbr;
  字体设置:
  VC的对话框字体设置对所有控件都有效,你不能单独地改变某个静态文本的字体。对于你的问题,需要首先用CreateFont来建立一个字体对象,然后调用控件的SetFont,就可以了。 
   例子: 
   1、改静态文体的ID,如:IDC_STATIC1 
   2、添加一个Edit控件,建立一个关联的控件m_editControl。 
   3、在OnInitDialog中添加如下代码: 
   CFont * f; 
   f = new CFont; 
   f->CreateFont(16, // nHeight 
   0, // nWidth 
   0, // nEscapement 
   0, // nOrientation 
   FW_BOLD, // nWeight 
   TRUE, // bItalic 
   FALSE, // bUnderline 
   0, // cStrikeOut 
   ANSI_CHARSET, // nCharSet 
   OUT_DEFAULT_PRECIS, // nOutPrecision 
   CLIP_DEFAULT_PRECIS, // nClipPrecision 
   DEFAULT_QUALITY, // nQuality 
   DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily 
   _T("Arial")); // lpszFac 
   m_editControl.SetFont(f); 
   m_editControl.SetWindowText("问专家"); 
   GetDlgItem(IDC_STATIC1)->SetFont(f); 
   
   需要注意的是,这里我们使用的是CFont指针,而不是普通的CFont局部变量。非MFC程序,首先用CreateFont来建立一个字体句柄,然后再用SendMessage发给控件WM_SETFONT消息,将建立的字体句柄赋值过去,就可以了。