熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

如何在VC中改變控件的背景色

2022-06-13   來源: .NET編程 

  在VC編程中要改變控件(諸如CView CFrameWnd or CWnd等)的背景色可通過處理特定的消息來實現但如果想改變按鈕的顏色就只能使用自繪制的按鈕(也可以用位圖按鈕此處未做說明)而不能通過OnCtlColor()改變 
  一在一個MFC應用程序中要改變控件的背景色可通過重載OnCtlColor()函數來實現方法是在該函數中設置所需顏色後再返回一個畫刷句柄便可重繪控件背景色OnCtlColor()函數對於控件背景色的處理是通過捕捉相應的控件消息來實現的常用的此類消息有

CTLCOLOR_DLG 對話框

CTLCOLOR_EDIT 編輯框

CTLCOLOR_LISTBOX 列表框

CTLCOLOR_MSGBOX 消息框

CTLCOLOR_SCROLLBAR 滑動條

CTLCOLOR_STATIC 靜態文本框矩形等

以下示例代碼說明如何更改以上控件的背景色


  

  //CmyDialogh定義

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()
};

//CmyDialogcpp 定義

……

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);
}
}

  說明可分別處理以上消息以實現不同控件不同背景色

此方法不適用於按紐控件

通過定制來實現不同顏色按紐

以下通過定制方形彩色按紐來說明

第一步派生出自己的按紐類

    //CcolorButtonh

class CColorButton : public CButton
{
DECLARE_DYNAMIC(CColorButton)
public:
CColorButton();
virtual ~CColorButton();
BOOL Attach(const UINT nID CWnd* pParent
const COLORREF BGColor = RGB( ) // 按紐的背景色
const COLORREF FGColor = RGB( ) // 文本顏色
);

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

  第二步定義各函數


    //CcolorButtoncpp
……
// 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;
focusRectCopyRect(&lpDIS>rcItem); //按紐的選中虛線框
btnRectCopyRect(&lpDIS>rcItem);
// 設置表示按紐被選中的虛線框
focusRectleft += ;
focusRectright = ;
focusRecttop += ;
focusRectbottom = ;

// 按紐標題
const int bufSize = ;
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 Rleft Rtop Rright Rtop RGB( ));
DrawLine(DC Rleft Rtop Rleft Rbottom RGB( ));
//以下繪制按紐的外圍框線以使按紐有立體感
DrawLine(DC Rleft + Rbottom Rright Rbottom RGB( ));
//繪制按紐左框線和上框線
DrawLine(DC Rright Rtop + Rright Rbottom RGB( ));
//繪制按紐右框線和下框線
}

//用色彩填充按紐框
void CColorButton::DrawFilledRect(CDC *DC CRect R COLORREF color)
{
CBrush B;
BCreateSolidBrush(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


    //CColorDlgh

class CColorDlg : public CDialog
{

// Implementation
protected:
CColorButton m_btnOK;
}

//CColorDlgcpp
……
BOOL CColorBtnSampleDlg::OnInitDialog()
{
CDialog::OnInitDialog();
……
VERIFY(m_btnOKAttach(IDOK this RED BLUE YELLOW));
……
}


From:http://tw.wingwit.com/Article/program/net/201311/11539.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.