请问用什么函数能动态地改变它的背景颜色呢,我用过SETBKCOLOR+SETBKMODE不行,而FILLRECT就不能改变光标所在的地方

解决方案 »

  1.   

    afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor );
    参见msdn,csdn上有很多,可以找一下。
      

  2.   

    //利用WM_CTLCOLOR消息实现Edit Control的文本与背景色的改变
    首先要明白:WM_CTLCOLOR是一个由控制(Control)发送给它父窗口的通知消息(Notification message)。实现步骤:
    生成一个标准的单文档应用程序框架,假设应用程序的名称为Color。我将利用它的About对话框做示范。在About dialog中添加两个Edit control,设定其ID为IDC_EDIT1与IDC_EDIT2。第一种方法(对应于IDC_EDIT1): 按照标准的Windows编程,由其父窗口的消息处理函数负责处理WM_CTLCOLOR消息。1. 在CAboutDlg中添加一个数据成员:HBRUSH m_brMine;
    2. 利用向导映射AboutDlg的WM_CTLCOLOR消息,产生函数:HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
    pDC是AboutDlg的设备上下文,pWnd是AboutDlg中发送该消息的control指针,nCtlColor市Control的类型编码。对其进行如下修改:HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
      if ((pWnd->GetDlgCtrlID() == IDC_EDIT1) && (nCtlColor == CTLCOLOR_EDIT))
      {
          COLORREF clr = RGB(255,0,0);
          pDC->SetTextColor(clr);   //设置红色的文本
          clr = RGB(0,0,0);
          pDC->SetBkColor(clr);     //设置黑色的背景
          m_brMine = ::CreateSolidBrush(clr);
          return m_brMine;  //作为约定,返回背景色对应的刷子句柄
      }
      else
      {
          HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
          return hbr;
      }
    }第二种方法(对应于IDC_EDIT2): 
    利用MFC 4.0的新特性: Message reflection。1.利用向导添加一个新的类:CColorEdit,基类为CEdit;
    2.在CColorEdit中添加一个数据成员: HBRUSH m_bkBrush;
    3.利用向导映射CColorEdit的"=WM_CTLCOLOR"消息,产生函数:HBRUSH CColorEdit::CtlColor(CDC* pDC, UINT nCtlColor); 对其进行如下修改:HBRUSH CColorEdit::CtlColor(CDC* pDC, UINT nCtlColor) 
    {
      COLORREF clr = RGB(0,0,0);
      pDC->SetTextColor(clr);   //设置黑色的文本
      clr = RGB(255,0,0);
      pDC->SetBkColor(clr);     //设置红色的背景
      m_bkBrush = ::CreateSolidBrush(clr);
      return m_bkBrush;  //作为约定,返回背景色对应的刷子句柄
    }4.利用向导为IDC_EDIT2生成一个数据成员CColorEdit m_coloredit;
    5.在定义CAboutDlg的color.cpp文件中加入:#include "coloredit.h"
      

  3.   

    响应WM_CTLCOLOR消息
    SetBkColor
      

  4.   

    如果用API写的话又是怎样写呢,我是这样的:
     Color=Rgb(100,0,0)
     SetBkColor hdc,Color
    但不能成功,总返回-1
      

  5.   

    哦返回成功了,但为何也改变不了它的颜色呢,请各位高手详细地写一写API的方法,因为我也要把它应用到VB里面,谢谢
      

  6.   

    你可以参考例子ctlcolorexplorer.zip(http://www.china-askpro.com/download/ctlcolorexplorer.zip),这个例子是关于这方面的最详细的演示,包括各种控件的颜色和字体的设置。
      

  7.   

    纯API的方法还是没有研究出来啊,请大家把MFC的方法改成API给我看看,其实上面的第一种方法里面,我最不明白的是这一句:return m_bkBrush;
    当返回一个正确的画刷的句柄的时候,HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)这个消息影射函数又是对这个返回值做了些什么的处理呢,我觉得关键是这里
      

  8.   

    我再顶,我就不信整个CSDN都没有人会
      

  9.   

    有个WM_ERASEBKGND消息用语处理背景.
      

  10.   

    自己写一个控件类继承CEDIT类,然后自定义一个方法,用化刷重新绘制背景。然后,你就可以这个类生成的对象调用该方法,动态来改变颜色了。我这里有这个类的一个示例代码:// ColorStatic.h : header file
    class CColorStatic : public CStatic
    {
    ……//省略了无关代码
    public:
        void SetTextColor(COLORREF TextColor);
        COLORREF m_TextColor;
        void SetBackColor(COLORREF BackColor);
        void SetCaption(CString strCaption);
        void Create(CString strCaption,COLORREF BackColor);
        COLORREF m_BackColor;
        CString m_strCaption;
    protected:
        //{{AFX_MSG(CColorStatic)
        afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
        afx_msg void OnPaint();
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
    }
    // ColorStatic.cpp
    BEGIN_MESSAGE_MAP(CColorStatic, CStatic)
        //{{AFX_MSG_MAP(CColorStatic)
        ON_WM_CREATE()
        ON_WM_PAINT()
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()void CColorStatic::OnPaint() //重画Static
    {
        CPaintDC dc(this); // device context for painting
        CRect rect;
        GetClientRect(&rect);
        dc.SetBkColor(m_BackColor);
        dc.SetBkMode(TRANSPARENT);
        CFont *pFont=GetParent()->GetFont();//得到父窗体的字体
        CFont *pOldFont;
        pOldFont=dc.SelectObject(pFont);//选用父窗体的字体
        dc.SetTextColor(m_TextColor);//设置文本颜色
        dc.DrawText(m_strCaption,&rect,DT_CENTER);//将文本画在Static的中央
        dc.SelectObject(pOldFont);    // Do not call CStatic::OnPaint() for painting messages
    }void CColorStatic::SetCaption(CString strCaption)
    {
        m_strCaption=strCaption;//设置Static文本
    }void CColorStatic::SetBackColor(COLORREF BackColor)
    {
        m_BackColor=BackColor;//设置背景颜色
    }void CColorStatic::SetTextColor(COLORREF TextColor)
    {
        m_TextColor=TextColor;//设置文字颜色
    }
    使用代码:m_ColorEdit.SubclassDlgItem(IDC_EDIT1,this);// IDC_EDIT1是其中一个EDIT的ID
    m_ColorEdit.SetBackColor(RGB(222,223,222));// RGB(222,223,222)就是要改变的背景颜色
    通过改变RGB的值,就可以动态改变EDIT控件的背景颜色了。
      

  11.   

    HBRUSH CSetupDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    COLORREF clr;
    switch(nCtlColor)
    {
    case CTLCOLOR_EDIT:
    clr = RGB(160,0,0);
    pDC->SetTextColor(clr);   //设置黑色的文本 clr = RGB(166,210,210);
    pDC->SetBkColor(clr);     //设置淡蓝色的背景

    m_brMine = ::CreateSolidBrush(clr);
    return m_brMine; //返回对应的刷子句柄 default:
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    return hbr;
    }
    }
      

  12.   

    纯API的方法就没有人会吗,我再顶
      

  13.   

    vb里面设置背景色用的着API吗?直接就可以附值
      

  14.   

    试了一下,响应WM_CTLCOLOR好像是不行的
    重载CButton类才能改变,在他的DrawItem里修改
      

  15.   

    to :crystal521(水晶泪) 
    m_brMine = ::CreateSolidBrush(clr);
    这句最好不放在CTLCOLOR内部,GDI泄露,因为没有释放。不信可以用管理器看一下,放到外边就可以了,句柄的返回放到这里就可以。
    在CTLCOLOR中好象可以改变啊,主要是由于RGB的原因,你可以用CColorDlg返回值而不用RGB,那样就可以改变颜色。可能 RGB需要做个转换
      

  16.   

    http://community.csdn.net/Expert/topic/3370/3370672.xml?temp=.679516
      

  17.   

    vb里面设置背景色用的着API吗?直接就可以赋值这个标准答案!!