写点什么

MFC|框架下自绘 CEdit 控件

  • 2022 年 7 月 17 日
  • 本文字数:1431 字

    阅读完需:约 5 分钟

前提

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()消息。

{
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 相比较来说,比较简单,理解起来也很是容易,只要掌握了反射机制,也就轻而易举了。


今天的更新就到这里了~


我是中国好公民 st,一名 C++开发程序媛~

发布于: 刚刚阅读数: 3
用户头像

书山有路勤为径,学海无涯苦作舟 2022.07.01 加入

擅长语言:C++ 涉及语言:Python

评论

发布
暂无评论
MFC|框架下自绘CEdit控件_c++_中国好公民st_InfoQ写作社区