“3.26如何改变一个视图的背景颜色?”中介绍的技术不能改变程序清单视图的背景颜色。因为程序清单视图是一种特殊类型的对话框,而Windows以特殊的方式处理对话框的背景颜色。所以,如果打算使程序清单视图具有生动的背景,则仔细按照下面的步骤进行:
第1步:在程序清单类中定义并初始化HBRUSH类型的成员变量。
第2步:使用ClassWizard在程序清单视图类中增加一个WM_CTLCOLOR消息句柄,该句柄的实现如下面的程序清单所示:
第3步:使用与下面相似的代码来改变程序清单视图的背景颜色。
// 2 - Force the view to repaint
Invalidate( TRUE );
}
void CDrawFormView::OnUpdateBackgroundBlue(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio( m_crBackColor == RGB( 0, 0, 255 ) );
}
解释:为了允许对话框(或程序清单视图)改变 用来绘画每个控件的颜色,Windows为对话框上的每个控件已经对话框本身发送WM_CTLCOLOR消息,该消息的句柄有如下的原型:
HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
调用pDC->SetTextColor()设置文本颜色,通过返回一个刷子句柄来来设置背景颜色,当返回一个刷子句柄时,须小心,当离开OnCtlColor函数时,不要释放该句柄----也就是说,在OnCtlColor()函数中不要返回一个在堆栈中创建的CBrush对象的句柄。
pWnd变量指向一个(可能是临时的)CWnd对象,它代表程序清单视图要绘制的颜色的控件。
nCtlColor变量指明了OnCtlColor()绘制的控件类型,该变量可以是下面的数值之一:
CTLCOLOR_BTN 按钮控件
CTLCOLOR_DLG 对话框本身
CTLCOLOR_EDIT 编辑控件
CTLCOLOR_LISTBOX 列表框控件
CTLCOLOR_MSGBOX 消息框
CTLCOLOR_SCROLLBAR 滚动条控件
CTLCOLOR_STATIC 静态控件