MFC框架下自绘CEdit控件

前提

MFC中的CEdit控件提供了编辑的功能。

该编辑框是一个自创阔举行,用户可以向里面输入任意类型的文本信息。

那么我们该如何优化控件的显示呢?接下来就介绍下如何继承并重绘CEdit控件。

该控件与其他控件的绘制方式都不同,既不是使用OnPaint方式,也不是使用DrawItem方式。而是采用了ON_WM_CTLCOLOR_REFLECT的反射机制。

那是OnPaint方式不能实现吗?

不是的。只是用OnPaint方式绘制时,比较麻烦,能用系统内部的消息为什么要自己写呢?尤其是多行风格时,采用OnPaint方式绘制文本时,刷新是一个非常麻烦的事情。

ON_WM_CTLCOLORREFLECT消息是WM_CTLCOLOR消息的反射。

WM_CTLCOLOR消息是用来完成对EDIT、STATIC以及BUTTON等空间设置背景和颜色的方法。

通过发射机制,让父窗口类去处理的消息变成了子控件窗口来处理,增强了封装性,也同时提高了子控件窗口类的可重用性。可谓是一举两得了。

那么在CEdit控件中当前发射消息是如何使用的呢?

自绘CEdit

对于ON_WM_CTLCOLORREFLECT发射消息的使用方式:

.h文件中的声明

afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);

.cpp文件中的使用

HBRUSH UIEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
}

在实际的使用过程中,需要先设置文字的背景色,再设置文本的颜色。

否则就会出现背景覆盖文本,从而看不到自己设置的文本内容了。(一般情况下,我们对文本绘制时都要遵循这种先背景后文本的操作)。

1:背景色

pDc->SetBKColor(m_crBackground);

解释:m_crBackground是使用者设置的自定义文本背景颜色值

2:文字颜色值

在CEidt控件中,有两种文本。

一个是提示文本内容;另外一个是实际的输入文本内容。

一般提示文本的内容是用灰色显示的。

但是我们都已经要自绘CEdit控件了,当然可以自定义提示文本的颜色值啦!

//获取在编辑框上输入的文本内容
CString strText;
CEdit::GetWindowText(strText);
if(strText != m_strCurBanner)
{
   pDC->SetTextColor(m_crText);
}
else
{
  pDC->SetTextColor(m_crCaptionText);
}

解释:

成员变量:m_strCurBanner是存储的提示文本内容。

当获取的编辑框文本不等于提示内容时,说明需要显示用户输入的正常文本,并且设置文本的颜色值m_crText

当获取的编辑框文本恰好是提示内容时,说明需要显示提示文本,并设置文本的颜色值m_crCaptionText

3:背景刷新

在重绘控件的同时一定要重写ON_WM_ERASEBKGND()消息。

void MYEdit::OnEraseBkgnd(CDC *pDC)
{

BOOL UIEdit::	CRect rect;
	GetClientRect(rect);
	pDC->FillSolidRect(rect,m_crBackground);
	return CEdit::OnEraseBkgnd(pDC);
}

解释:在每次刷新背景的同时,需要重新设置背景颜色值。

4:边框绘制

我们在控件中改如何修改控件的边框风格呢?

是在OnPaint中吗?

NO!

在MFC框架中对于边框风格的修改有一个特定的消息:ON_WM_NCPAINT

绘制控件的非客户去消息,这其中就包括了控件的边框

void UIEdit::OnNcPaint()
{
	CEdit::OnNcPaint();
	if (m_bSetBorderColor == TRUE)
	{
		//绘制边框
		CDC  *pDC = GetWindowDC();
		CRect   rRect;
		GetWindowRect(&rRect);
		rRect.OffsetRect( - rRect.left , -rRect.top);
		pDC->FrameRect(&rRect , &m_brushBorder);
		rRect.InflateRect(-1 , -1);
		pDC->FrameRect(&rRect , &m_brushBorder);
		ReleaseDC(pDC);
	}
}

总结

以上就是对MFC框架下CEdit的控件的风格设置啦,与重绘OnPaint相比较来说,比较简单,理解起来也很是容易,只要掌握了反射机制,也就轻而易举了。

今天的更新就到这里了~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糯诺诺米团

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值