如何使用最简单的方法设置Button 的背景颜色和Button上的字体颜色。

解决方案 »

  1.   

    第一步:派生出自己的按纽类。//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); //重定义虚拟函数DrawItemvoid 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……// CColorButtonIMPLEMENT_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.hclass CColorDlg : public CDialog{…..// Implementationprotected:CColorButton m_btnOK;}
    //CColorDlg.cpp…….BOOL CColorBtnSampleDlg::OnInitDialog(){CDialog::OnInitDialog();…….VERIFY(m_btnOK.Attach(IDOK, this, RED, BLUE, YELLOW));…….}……
      

  2.   

    See the link below, several samples there, FYI :http://www.codeproject.com/buttonctrl/#Owner-draw buttons
      

  3.   


    有简单一点的方法吗?
    我只是想改变一下BUTTON的背景色,我希望能象在VB里那样简单;
    最好一句话搞定。
      

  4.   

    HBITMAP SetBitmap( HBITMAP hBitmap );把背景和字都做好,再把图贴上~~
      

  5.   

    : LookSail(老得牙都掉了还在学)
       谢谢,
       楼上的那位老兄写的确实很详细了,但就是代码多了点,
       我想用最简单的方法,最少的代码来实现,可能吗?
      

  6.   

    http://61.185.237.43:81/shownews.asp?newsid=335
      

  7.   

    交Button的Style设置位图,做一个你想要的的颜色的位图,然后在按钮上画出来。OK
      

  8.   

    谢谢各位。
    由于我不想把问题一个劲的往后拖延,而且还要使用较简单的代码,所以我只好不用设置背景色这个方法了,而用设置背景图片这种方法了。HBITMAP hb=::LoadBitmap(AfxGetInstanceHandle(),"IDB_BITMAP1");
    HBITMAP hp=m_MyButton.SetBitmap( HBITMAP hBitmap );多简单的代码呀!
      

  9.   

    处理WM_CTLCOLOR消息,这是专门用来设置各控件及对话框的背景色的,巨简单
      

  10.   

    : dozoo(游侠) 
       Can not set backcolor of button!
      

  11.   

    用m_button.setbitmap()怎么不会再在按钮上显示图片呢
      

  12.   

    jincai78(陈进),你有没有做出来啊,用设置背景图片这种方法了
    我怎么不行呢
      

  13.   

    HBITMAP hb=::LoadBitmap(AfxGetInstanceHandle(),"IDB_BITMAP1");
    HBITMAP hp=m_MyButton.SetBitmap( HBITMAP hBitmap );
    我怎么没有弄出来呢
    HBITMAP hp=m_MyButton.SetBitmap( HBITMAP hBitmap );应该是
    HBITMAP hp=m_MyButton.SetBitmap( hb);吧
      

  14.   

    yes ,
    I wrong.我的信誉为何下降了,oh my day!!!!!结帐!!!