VC6.0 如何设置文本框背景颜色

VC6.0 如何设置文本框背景颜色,第1张

VC6.0是可以设置

文本框

的背景颜色的,步骤如下。

1.

为文本框添加消息处理函数OnCtlColor;

2.

在该函数中添加如下代码

if(pWnd->GetDlgCtrlID()==IDC_TEXT) {

pDC->

SetBkColor

(RGB(255,0,0))//颜色设置,可根据具体需要调整

}

1、在VC编程中要改变控件(诸如CView,

CFrameWnd,

or

CWnd等)的背景色可通过处理特定的消息来实现。但如果想改变按钮的颜色,就只能使用自绘制的按钮(也可以用位图按钮)而不能通过OnCtlColor()改变。

2、在一个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)、此方法不适用于按纽控件。

3、通过定制来实现不同颜色按纽。

第一步:派生出自己的按纽

//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))

…….

}

---- 方法一:调用CWinApp类的成员函数SetDialogBkColor来实现。

---- 其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色。下面的例子是将应用程序对话框设置为蓝色背景和红色文本,步骤如下:

---- ① 新建一个基于Dialog的MFC AppWizard应用程序ExampleDlg。

---- ② 在CExampleDlgApp ::InitInstance()中添加如下代码:

BOOL CExampleDlgApp: : InitInstance ( )

{

CExampleDlgDlg dlg

m_pMainWnd = &dlg

//先于DoModal()调用,将对话框设置为蓝色背景、红色文本

SetDialogBkColor(RGB(0,0,255),RGB(255,0,0))

int nResponse = dlg.DoModal()

}

---- 编译并运行,此时对话框的背景色和文本色已发生了改变。值得注意的是:在调用DoModal()之前必须先调用SetDialogBkColor,且此方法是将改变应用程序中所有的对话框颜色,并不能针对某一个指定的对话框。

---- 方法二:重载OnPaint(),即WM_PAINT消息。有关代码如下(以上例工程为准):

void CExampleDlgDlg::OnPaint()

{

if (IsIconic())

else

{

CRect rect

CPaintDC dc(this)

GetClientRect(rect)

dc.FillSolidRect(rect,RGB(0,255,0))//设置为绿色背景

CDialog::OnPaint()

}

---- 方法三:重载OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor),即WM_CTLCOLOR消息。具体步骤如下(以上例工程为准):

---- ①在CExampleDlgDlg的头文件中,添加一CBrush的成员变量:

class CExampleDlgDlg : public CDialog

{

...

protected:

CBrush m_brush

...

}

---- ②在OnInitDialog()函数中添加如下代码:

BOOL CExampleDlgDlg::OnInitDialog()

{

...

// TODO: Add extra initialization here

m_brush.CreateSolidBrush(RGB(0, 255, 0))// 生成一绿色刷子

...

}

---- ③利用ClassWizard重载OnCtlColor(…),即WM_CTLCOLOR消息:

HBRUSH CExampleDlgDlg::OnCtlColor

(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

/*

** 这里不必编写任何代码!

**下行代码要注释掉

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

*/

return m_brush//返加绿色刷子

}

---- 方法四:还是重载OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor),即WM_CTLCOLOR消息。具体步骤如下(以上例工程为准):

---- 步骤①、②同上方法三中的步骤①、②。

---- 步骤③利用ClassWizard重载OnCtlColor(…)(即WM_CTLCOLOR消息)时则有些不同:

HBRUSH CExampleDlgDlg::OnCtlColor

(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

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

//在这加一条是否为对话框的判断语句

if(nCtlColor ==CTLCOLOR_DLG)

return m_brush//返加绿色刷子

return hbr

}

---- 编译并运行即可。

---- 关于如何改变对话框背景颜色的问题,可能还有很多种不同方法可以实现,笔者在这仅举出四种常见的方法。其中方法三的编程似乎有点不太规范,方法四则要比方法三正统些,笔者这样的对比举例是为了拓宽VC编程爱好者特别是初学者的编程思路,读者可以根据实际情况选用其中的一种。如果再结合《软件报》2000年第5期中改变对话框上的控件颜色,相信会使您的MFC应用程序"增色"不少


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/11387426.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存