C++乐园

C/C++ 交流

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  12 随笔 :: 18 文章 :: 14 评论 :: 0 Trackbacks


动态改变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;
 

posted on 2008-09-18 13:27 小不懂^_^ 阅读(7131) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理