改变控件背景色,OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)是唯一的方法吗?
我找了半天资料,100%都是重载此方法来实现改变控件背景色的功能的。现在我有一个问题,我用了别了一段绘图的代码,如果我重载OnCtlColor方法的话,那运行一代时间就报错,我去掉OnCtlColor里面的代码后就没问题,这里面的代码是msdn那里面一段,所以不是这代码的问题。
现在我就想不用此方法,即用重载OnCtlColor的方法,实现改变控件背景色的功能!求此方法。还问个问题,我在静态控件加载img后,然后往这止面放一个lable控件,为什么不能改变字体了?听说如果背景用了图片,就不能改变此上面的控件的字体及颜色了?有这回事吗?
怎么改变这种情况下的字体呢?

解决方案 »

  1.   

    syy64(太平洋) ( ) 信誉:145  2006-08-13 17:03:00  得分: 0  
     
     
       SetDlgBkColor函数。
      
     ---------------
    没有此方法吧?
      

  2.   

    好长时间没用,有点忘了,应该是这样。CWinApp::SetDialogBkColor 
    void SetDialogBkColor( COLORREF clrCtlBk = RGB(192, 192, 192), COLORREF clrCtlText = RGB(0, 0, 0) );ParametersclrCtlBkThe dialog background color for the application.clrCtlTextThe dialog control color for the application.ResCall this member function from within the InitInstance member function to set the default background and text color for dialog boxes and message boxes within your application.ExampleBOOL CMyApp::InitInstance()
    {
       // Standard initialization   SetDialogBkColor();        // Set dialog background color to gray
       LoadStdProfileSettings();  // Load standard INI file options (including MRU)   // ...
    }CWinApp Overview |  Class Members |  Hierarchy Chart
      

  3.   

    好像没用啊,怎么用啊?
    我是想改变其中某几个控件的背景色,怎么改啊?奇怪的就是不能用OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor).
    一时也很难找出原因!
    所以还是求不用此方法的改变控件背景色的方法!
      

  4.   

    void CCLEMMView::OnCpalldbCplledit() 
    {
    // TODO: Add your command handler code here
    CCPLLDBEditDlg CPLLDBEditDlg; CPLLDBEditDlg.m_strLandParcelNo = m_strLandParcelNo;
    AfxGetApp()->SetDialogColor(RGB(0, 192, 192), RGB(255, 255, 0));
    if(CPLLDBEditDlg.DoModal()==IDOK)
    {
    m_strLandParcelNo = CPLLDBEditDlg.m_strLandParcelNo;
    }
    }
      

  5.   

    通过返回一个画刷, OnCtlColor 中只能改变部分控件的背景色,比如静态控件。对于大部分控件比如按钮,还是要从原类派生,重载 DrawItem 函数进行自绘。
      

  6.   

    用SetFont设置你想要的字体就可以。
      

  7.   

    呵呵,思危说的对OnCtlColor不是万能滴摧荐子类化方法,去找找你需要的控件的子类吧
      

  8.   

    如何在VC中改变控件的背景色提要:
      在VC编程中要改变控件(诸如CView, CFrameWnd, or CWnd等)的背景色可通过处理特定的消息来实现。但如果想改变按钮的颜色,就只能使用自绘制的按钮(也可以用位图按钮,此处未做说明)而不能通过OnCtlColor()改变。正文:
      一、在一个MFC应用程序中,要改变控件的背景色可通过重载OnCtlColor()函数来实现。方法是在该函数中设置所需颜色后再返回一个画刷句柄便可重绘控件背景色。OnCtlColor()函数对于控件背景色的处理是通过捕捉相应的控件消息来实现的。常用的此类消息有:
    CTLCOLOR_DLG 对话框 
    CTLCOLOR_EDIT 编辑框
    CTLCOLOR_LISTBOX 列表框 
    CTLCOLOR_MSGBOX 消息框
    CTLCOLOR_SCROLLBAR 滑动条
    CTLCOLOR_STATIC 静态文本框、矩形等。以下示例代码说明如何更改以上控件的背景色:
    //CmyDialog.h定义 
    class CMyDialog : public Cdialog //派生自己的对话框类
    {
    ……..
    // Implementation 
    protected: 
    // Generated message map functions
    //{{AFX_MSG(CMyDialog)
    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
    ……. 
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP() 
    };//CmyDialog.cpp 定义
    ……
    HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    switch (nCtlColor) { 
    case CTLCOLOR_EDIT:
    case CTLCOLOR_MSGBOX:
    case CTLCOLOR_DLG : 
    case CTLCOLOR_EDIT : //在此加入你想要改变背景色的控件消息
    pDC->SetBkMode(TRANSPARENT);
    HBRUSH B = CreateSolidBrush(COLOR); //COLOR是你想设置的颜色 
    return (HBRUSH) B;
    default: //其他控件设置自己默认的颜色和背景刷.
    return CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 
    }}
    说明:1、可分别处理以上消息以实现不同控件不同背景色。
    2、此方法不适用于按纽控件。二、通过定制来实现不同颜色按纽。
    以下通过定制方形彩色按纽来说明: 
    第一步:派生出自己的按纽类。
    //CcolorButton.h 
    class CColorButton : public CButton
    {
    DECLARE_DYNAMIC(CColorButton)
    public:
    CColorButton(); 
    virtual ~CColorButton(); BOOL Attach(const UINT nID, CWnd* pParent, 
    const COLORREF BGColor = RGB(192, 123, 192), // 按纽的背景色
    const COLORREF FGColor = RGB(1, 1, 1), // 文本颜色
    );
    protected:
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS); //重定义虚拟函数DrawItem
    void DrawFrame(CDC *DC, CRect R); //绘制按纽框
    void DrawFilledRect(CDC *DC, CRect R, COLORREF color); //填充按纽框
    void DrawLine(CDC *DC, CRect EndPoints, COLORREF color); 
    void DrawLine(CDC *DC, long left, long top, long right, long bottom, COLORREF color);
    void DrawButtonText(CDC *DC, CRect R, const char *Buf, COLORREF TextColor);
    //绘制按纽上的文本COLORREF GetFGColor() { return m_fg; } 
    COLORREF GetBGColor() { return m_bg; }
    private:
    COLORREF m_fg, m_bg;
    };
    #endif第二步:定义各函数
    //CcolorButton.cpp
    ……
    // CColorButton
    IMPLEMENT_DYNAMIC(CColorButton, CButton)
    CColorButton::CColorButton() 
    { } 
    CColorButton::~CColorButton()
    {
    } //定义Attach()函数
    BOOL CColorButton::Attach(const UINT nID, CWnd* pParent, const COLORREF BGColor, const COLORREF FGColor)
    {
    if (!SubclassDlgItem(nID, pParent))
    return FALSE;
    m_fg = FGColor;
    m_bg = BGColor; 
    return TRUE;
    }//重载DrawItem()
    void CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
    {
    CDC* pDC = CDC::FromHandle(lpDIS->hDC);
    UINT state = lpDIS->itemState; 
    CRect focusRect, btnRect;
    focusRect.CopyRect(&lpDIS->rcItem); //按纽的选中虚线框
    btnRect.CopyRect(&lpDIS->rcItem); // 设置表示按纽被选中的虚线框
    focusRect.left += 4;
    focusRect.right -= 4;
    focusRect.top += 4;
    focusRect.bottom -= 4;// 按纽标题
    const int bufSize = 512;
    TCHAR buffer[bufSize];
    GetWindowText(buffer, bufSize);// 绘制并标志按纽 
    DrawFilledRect(pDC, btnRect, GetBGColor()); 
    DrawFrame(pDC, btnRect);
    DrawButtonText(pDC, btnRect, buffer, GetFGColor());// 如果按纽处于选中状态则在其上绘制选中虚线框
    if (state & ODS_FOCUS) {
    DrawFocusRect(lpDIS->hDC, (LPRECT)&focusRect);
    }
    }
    void CColorButton::DrawFrame(CDC *DC, CRect R)
    { //绘制按纽,用户通过定制该函数可实现不同形状的按纽。
    DrawLine(DC, R.left, R.top, R.right, R.top, RGB(255, 255, 255)); 
    DrawLine(DC, R.left, R.top, R.left, R.bottom, RGB(255, 255, 255)); 
    //以下绘制按纽的外围框线以使按纽有立体感
    DrawLine(DC, R.left + 1, R.bottom - 1, R.right, R.bottom - 1, RGB(1, 1, 1));
    //绘制按纽左框线和上框线
    DrawLine(DC, R.right - 1, R.top + 1, R.right - 1, R.bottom, RGB(1, 1, 1));
    //绘制按纽右框线和下框线 
    }
    //用色彩填充按纽框
    void CColorButton::DrawFilledRect(CDC *DC, CRect R, COLORREF color)

    CBrush B;
    B.CreateSolidBrush(color);
    DC->FillRect(R, &B);
    }
    // DrawLine用于绘制按纽,其为多态函数
    void CColorButton::DrawLine(CDC *DC, CRect EndPoints, COLORREF color)

    ……
    }
    void CColorButton::DrawLine(CDC *DC, long left, long top, long right, long bottom, COLORREF color)

    ……
    }
    //绘制按纽文本
    void CColorButton::DrawButtonText(CDC *DC, CRect R, const char *Buf, COLORREF TextColor)
    {
    COLORREF prevColor = DC->SetTextColor(TextColor);
    DC->SetBkMode(TRANSPARENT);
    DC->DrawText(Buf, strlen(Buf), R, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
    DC->SetTextColor(prevColor);
    }第三步:引用定制类
    定制任意对话框CColorDlg,在其上画一按键控件。ID为IDOK。
    //CColorDlg.h
    class CColorDlg : public CDialog
    {
    …..
    // Implementation
    protected:
    CColorButton m_btnOK;
    }//CColorDlg.cpp
    …….
    BOOL CColorBtnSampleDlg::OnInitDialog()
    {
    CDialog::OnInitDialog();
    …….
    VERIFY(m_btnOK.Attach(IDOK, this, RED, BLUE, YELLOW));
    …….
    }
    ……
      

  9.   

    在图上放一个static text控件,不能改变此控件的字体及颜色啊!好郁闷!楼上的方法我都看过了,似乎都没什么直接的指导意义啊,不好意思了。其它任何开发工具delphi,vb,c#等,都只是在属性中设置一下就行了,
    这VC怎么就连这点简单的功能都要自已写啊!美中不足!
    美中不足啊!
      

  10.   

    新写一个类重载=wm_ctlcolor反射消息或者新写一个类重载DrawItem不喜欢在父窗口处理控件
      

  11.   

    HBRUSH CTest3Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    //HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO: Change any attributes of the DC here
    int nID = pWnd->GetDlgCtrlID();
    pDC->SetBkMode(OPAQUE);
    if( nID == IDC_EDIT1) //此处为你的文本框ID
    {
    pDC->SetBkColor(RGB(0,0,255));//控件背景色
    pDC->SetTextColor( RGB( 0,255,0 ) );//控件前景色(文字)
        return ::CreateSolidBrush(RGB(0,0,255));//控件底色
    }
    //return hbr;
    // TODO: Return a different brush if the default is not desired
    return hbr;
    }
      

  12.   

    重载CXXXDlg OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 应该是不行的;
    需要重载CStatic CtlColor(CDC* pDC, UINT nCtlColor)就可以了.
    俺们就是这样用的.
      

  13.   


    以下代码可供参考://MyStatic.hclass CMyStatic : public CStatic
    {
    // Construction
    public:
    CMyStatic(); CBrush brHollow; COLORREF clrText;
    COLORREF clrBk;...........};//MyStatic.cppCMyStatic::CMyStatic()
    {
    brHollow.CreateStockObject(HOLLOW_BRUSH);
    clrText = RGB(255, 0, 0);
    clrBk = RGB(0, 255, 0);
    }
    HBRUSH CMyStatic::CtlColor(CDC* pDC, UINT nCtlColor) 
    {
    // TODO: Change any attributes of the DC here pDC->SetBkColor(clrBk); //这里主要
    pDC->SetTextColor(clrText); //这里主要
    return brHollow; // TODO: Return a non-NULL brush if the parent's handler should not be called
    return NULL;
    }
      

  14.   

    return brHollow;
    return NULL;
    两个返回值??
    我是过类似的程序编辑一个CEdit控件,好像还有问题。
    请赐教
      

  15.   

    哎,VC就是界面这里比较麻烦,其它的都Very Good。
      

  16.   

    Static控件选中Simple属性后就透明啦,不需要代码处理那么麻烦咯 :)另外,谁知道OnCtlColor除了返回一个HOLLOW_BRUSH外还可以返回别的刷子刷背景透明么?