我想在OnCtlColor函数中重绘对话框的背景,由于对话框中有一些控件,我希望重绘背景的时候可以根据控件的不同绘制不同的背景颜色,该怎么实现。假设我有两个Pciture控件,控件ID分别是IDC_1和IDC_2。我希望对话框的背景设置成RGB(175,203, 247),IDC_1的背景设置成RGB(255,255,255),IDC_2的背景设置成RGB(0,0,0)。OnCtlColor函数中的函数如何写?

解决方案 »

  1.   

    HBRUSH CCBrushdemoDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO: Change any attributes of the DC here
    if (pWnd == this)
           return brush;
    else if (pWnd == GetDlgItem(IDC_1))
             return brush1;
    else if (pWnd == GetDlgItem(IDC_2))
             return brush2;
    // TODO: Return a different brush if the default is not desired
    return hbr;
    }
    brush 代表背景画刷,brush1代表控件1画刷
      

  2.   

    楼上帅哥,我按你要求写了,但是还是有些问题,不知道是不是和我控件的性质有关系,我的IDC_1和IDC_2控件是Frame风格的Picture控件。我OnCtlColor的源代码如下:
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    hbr = ::CreateSolidBrush ( m_crBk ); //m_crBk是我在别处定义的一个画刷。if (pWnd == this)
    {
    HBRUSH brush = ::CreateSolidBrush ( m_crBk );
    MessageBox("123");//这里有反应,说明对话框背景已经发生了重绘。  return brush;
    }
    else if (pWnd == GetDlgItem(IDC_1))
    {
     HBRUSH brush = ::CreateSolidBrush ( RGB(255,255,255) );
     MessageBox("456");//这里居然都弹不出来,说明根本没有执行这段程序。  return brush;
    }
    else if (pWnd == GetDlgItem(IDC_2))
    {
     HBRUSH brush = ::CreateSolidBrush ( RGB(0,0,0) );
      return brush;
    }return hbr;运行后我发现,整个对话框包括所有控件在内的背景都被绘制成了m_crBk 的颜色。
    但是控件背景并没有被单独绘制。
    原因何在?
      

  3.   

    忘了说下,我确定控件ID没有错的,IDC_1和IDC_2
      

  4.   

    HBRUSH CCBrushdemoDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO: Change any attributes of the DC here
    if (pWnd->GetDlgCtrlID() == IDD_CBRUSHDEMO_DIALOG)
    return hbr;
    else if(pWnd->GetDlgCtrlID() == IDC_1)
    {
    //AfxMessageBox("11");
    return blueBrush;
    }
    else if (pWnd->GetDlgCtrlID() == IDC_2)
    return redBrush;
        
    // TODO: Return a different brush if the default is not desired}
      

  5.   

    HBRUSH CCBrushdemoDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO: Change any attributes of the DC here
    if (pWnd == this)
    return brush;
    else if(pWnd->GetDlgCtrlID() == IDC_IDC_1)
    {
    //AfxMessageBox("11");
    return blueBrush;
    }
    else if (pWnd->GetDlgCtrlID() == IDC_2)
    return redBrush;
        
    // TODO: Return a different brush if the default is not desired}