//对话框颜色控制代码
//对话框变量
HBRUSH m_brushBack;
HBRUSH FunctionWindowA::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { /* 问题的根本原因是需要需要设置对话框及其控件为不同的背景颜色以美化界面, 从而使用了 HBRUSH m_brushBack对象,尤其是通过线程消息或定时器不断更新数据时, GDI对象会不断增长,超过系统的GDI数目限制(9999),从而使程序崩溃。 问题的本质就是不断改变内容的部件不能使用背景刷 (一) 为了解决GDI对象不断增长的问题,(GDI对象不能超过9999) 控件颜色的设置注意事项:(问题的本质就是不断改变内容的部件不能使用背景刷) 1 背景刷使用窗口成员变量 HBRUSH m_brushBack; 2 利用控件类型进行设置时,如果该类型中包含不断刷新内容的控件则不能使用背景刷; 3 使用控件ID,对内容保持不变的控件,可以进行颜色背景设置; 4 可利用标签的ID默认都为IDC_STATIC的特性,对内容保持不变的标签,进行颜色背景设置。 (二)参考资料 1 仿照QQ的浅蓝色:COLORREF QQcolor=RGB(200,224,251) 2 控件类型 CTLCOLOR_BTN 按钮控件 CTLCOLOR_DLG 对话框 CTLCOLOR_EDIT 编辑框 CTLCOLOR_LISTBOX 列表控件 CTLCOLOR_MSGBOX 消息控件 CTLCOLOR_SCROLLBAR 滚动条控件 CTLCOLOR_STATIC 静态控件 */ HBRUSH hbr = CDialog::OnCtlColor(pDC,pWnd, nCtlColor); COLORREF QQcolor=RGB(200,224,251); // 设置功能区背景 if ( (pWnd->GetDlgCtrlID() == IDC_STATICbg) || (pWnd->GetDlgCtrlID() == IDC_STATICbg2) || (pWnd->GetDlgCtrlID() == IDC_STATICbg3) ) { //pDC-> SetTextColor(RGB(255,0,0)); //字体颜色 //pDC-> SetBkColor(RGB(255,255, 255)); //字体背景色 //pDC-> SetBkMode(OPAQUE); m_brushBack= CreateSolidBrush(RGB(200,204,220)); //创建画刷 return HBRUSH(m_brushBack); } // 利用ID设置标签的颜色和背景,一般标签的ID都是IDC_STATIC; //这些标签的内容是固定不变的 if (pWnd->GetDlgCtrlID() == IDC_STATIC) { pDC-> SetTextColor(RGB(0,0,255)); //字体颜色 pDC-> SetBkColor(RGB(200,204,220)); //字体背景色 pDC-> SetBkMode(TRANSPARENT); m_brushBack= CreateSolidBrush(RGB(200,204,220)); //创建画刷 return HBRUSH(m_brushBack); } //利用类型设置标签的字体颜色,不能使用背景刷 //这些标签的内容是不断变化的 if (nCtlColor==CTLCOLOR_STATIC) { pDC-> SetTextColor(RGB(255,0,0)); //字体颜色 pDC-> SetBkColor(RGB(200,204,220)); //字体背景色 pDC-> SetBkMode(TRANSPARENT); } //编辑框 if (nCtlColor==CTLCOLOR_EDIT) { pDC-> SetTextColor(RGB(0,0,255)); //字体颜色 pDC-> SetBkColor(RGB(255,255, 255)); //字体背景色 pDC-> SetBkMode(TRANSPARENT); m_brushBack= CreateSolidBrush(RGB(200,224,251)); //创建画刷 return HBRUSH(m_brushBack); } //// 利用ID设置窗口的背景颜色 // if (nCtlColor == CTLCOLOR_DLG) { //// pDC-> SetTextColor(RGB(255,0,0)); //字体颜色 ////pDC-> SetBkColor(RGB(200,204,220)); //字体背景色 ////pDC-> SetBkMode(TRANSPARENT); //m_brushBack= CreateSolidBrush(RGB(200,224,251)); //创建画刷 // return HBRUSH(m_brushBack); // } //只能返回系统的背景刷hbr return (HBRUSH) hbr; }
//画刷函数
void FunctionWindowA::OnPaint() { CPaintDC dc(this); // device context for painting CRect rect; GetClientRect(rect); dc.FillSolidRect(rect,RGB(200,224,251)); dc.FillPath(); // TODO: 在此处添加消息处理程序代码 // 不为绘图消息调用 CDialog::OnPaint(); }