动态改变Dialog中IDC_STATIC的文字:
SetDlgItemText(IDC_STATIC,"ABC");
动态改变Dialog中IDC_STATIC文字的颜色:
重载OnCtlColor函数,在要更改颜色的时候向对话框发送WM_CTLCOLOR就行了。
1.在对话框的类中加入成员:
CBrush m_brush;
COLORREF m_color;
2.在OnInitDialog()中,加入
m_brush.CreateSolidBrush(RGB(255,255,255));
//此处设置的RGB值可以改变控件的背景色。
m_color=RGB(0,0,0)
//此处设置控件的文字初始颜色。
3.响应WM_ONCTLCOLOR消息,重载OnCtlColor()函数,加入:
if(nCtlColor== CTLCOLOR_STATIC){
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(m_color);
return (HBRUSH)m_brush.GetSafeHandle();
}
4.需要改变颜色时
m_color=RGB(128,0,255);//此处改变字体的颜色
CStatic* m_pStatic1=(CStatic*)GetDlgItem(IDC_STATIC1);
m_pStatic1->RedrawWindow();
关于控件背景和字体颜色设置的疑惑,只要70分,一问题35分
qiangv (说完就走) 2005-03-05 20:15:15 在 VC/MFC / 界面 提问如一个dialog中有一button,一edit控件
1。把dialog画出来是发生在initinstance之后么,每个控件都是一个窗口
他们的回调函数都是AfxWinPro()
有一个函数OnCtlColor是响应画出来这个消息的么?能不能把发生的流程说出来。
2。还有改变button按钮的背景色和前景色为什么要新建一个类,而不能在onctlcolor中改变呢
ownerdraw是什么意思,什么时候发生呢?
问题点数:70、回复次数:3
1、OnCtlColor是响应WM_CTLCOLOR消息的函数。当子控件将要被绘制的时候,就会发送一个WM_CTLCOLOR消息给它的父窗口(通常是对话框),父窗口准备正确的颜色来绘制子窗口。在一个对话框中,每一个控件的绘制都会发送这个消息,也就是说这个OnCtlColor函数会被调用多次。OnCtlColor是一个虚函数,在没有被覆盖之前,直接调用父类的OnCtlColor函数,返回一个画刷句柄,并用这个返回的画刷句柄去绘制这个控件。因此,我们可以在这个函数中来设置控件的背景和控件上文字的颜色、文字字体及文字的背景色,但是对于Button控件,却不能直接来改变背景颜色。
2、Button是一种自绘制控件,在自绘制之前就会调用一个虚函数CButton;;DrawItem(),因此,要想改变Button的背景及字体,就要定义一个Button类从CButton派生出来,并且覆盖DrawItem(),则当要绘制这个按钮的时候,框架就会调用这个函数。来改变Button的背景颜色和字体,此外,还要设置控件的ownerdraw属性.
MSDN上有查过...有一点不明白
所谓自绘是不是它有自己的ondraw函数?
它的WM_CTLCOLOR消息不是一样送到和别的控件一样的回调函数里去么?
它也继承了CWND
应该也有OnCtlColor函数的呀
1.还有改变button按钮的背景色和前景色为什么要新建一个类,而不能在onctlcolor中改变呢
ownerdraw是什么意思,什么时候发生呢?
因为在他上面贴了一层用于显示标题或贴图.
要改变对话框的一般颜色,可以在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;