MFC中的CEdit控件提供了编辑的功能。
该编辑框是一个自创阔举行,用户可以向里面输入任意类型的文本信息。
那么我们该如何优化控件的显示呢?接下来就介绍下如何继承并重绘CEdit控件。
该控件与其他控件的绘制方式都不同,既不是使用OnPaint方式,也不是使用DrawItem方式。而是采用了ON_WM_CTLCOLOR_REFLECT的反射机制。
那是OnPaint方式不能实现吗?
不是的。只是用OnPaint方式绘制时,比较麻烦,能用系统内部的消息为什么要自己写呢?尤其是多行风格时,采用OnPaint方式绘制文本时,刷新是一个非常麻烦的事情。
ON_WM_CTLCOLORREFLECT消息是WM_CTLCOLOR消息的反射。
WM_CTLCOLOR消息是用来完成对EDIT、STATIC以及BUTTON等空间设置背景和颜色的方法。
通过发射机制,让父窗口类去处理的消息变成了子控件窗口来处理,增强了封装性,也同时提高了子控件窗口类的可重用性。可谓是一举两得了。
那么在CEdit控件中当前发射消息是如何使用的呢?
对于ON_WM_CTLCOLORREFLECT发射消息的使用方式:
.h文件中的声明
afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
.cpp文件中的使用
- HBRUSH UIEdit::CtlColor(CDC* pDC, UINT nCtlColor)
- {
- }
在实际的使用过程中,需要先设置文字的背景色,再设置文本的颜色。
否则就会出现背景覆盖文本,从而看不到自己设置的文本内容了。(一般情况下,我们对文本绘制时都要遵循这种先背景后文本的操作)。
pDc->SetBKColor(m_crBackground);
解释:m_crBackground是使用者设置的自定义文本背景颜色值
在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
在重绘控件的同时一定要重写ON_WM_ERASEBKGND()消息。
- void MYEdit::OnEraseBkgnd(CDC *pDC)
- {
-
- BOOL UIEdit:: CRect rect;
- GetClientRect(rect);
- pDC->FillSolidRect(rect,m_crBackground);
- return CEdit::OnEraseBkgnd(pDC);
- }
解释:在每次刷新背景的同时,需要重新设置背景颜色值。
我们在控件中改如何修改控件的边框风格呢?
是在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相比较来说,比较简单,理解起来也很是容易,只要掌握了反射机制,也就轻而易举了。
今天的更新就到这里了~