• 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文件中的使用

    1. HBRUSH UIEdit::CtlColor(CDC* pDC, UINT nCtlColor)
    2. {
    3. }

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

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

    1:背景色

    pDc->SetBKColor(m_crBackground);

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

    2:文字颜色值

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

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

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

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

    1. //获取在编辑框上输入的文本内容
    2. CString strText;
    3. CEdit::GetWindowText(strText);
    4. if(strText != m_strCurBanner)
    5. {
    6. pDC->SetTextColor(m_crText);
    7. }
    8. else
    9. {
    10. pDC->SetTextColor(m_crCaptionText);
    11. }

    解释:

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

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

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

    3:背景刷新

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

    1. void MYEdit::OnEraseBkgnd(CDC *pDC)
    2. {
    3. BOOL UIEdit:: CRect rect;
    4. GetClientRect(rect);
    5. pDC->FillSolidRect(rect,m_crBackground);
    6. return CEdit::OnEraseBkgnd(pDC);
    7. }

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

    4:边框绘制

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

    是在OnPaint中吗?

    NO!

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

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

    1. void UIEdit::OnNcPaint()
    2. {
    3. CEdit::OnNcPaint();
    4. if (m_bSetBorderColor == TRUE)
    5. {
    6. //绘制边框
    7. CDC *pDC = GetWindowDC();
    8. CRect rRect;
    9. GetWindowRect(&rRect);
    10. rRect.OffsetRect( - rRect.left , -rRect.top);
    11. pDC->FrameRect(&rRect , &m_brushBorder);
    12. rRect.InflateRect(-1 , -1);
    13. pDC->FrameRect(&rRect , &m_brushBorder);
    14. ReleaseDC(pDC);
    15. }
    16. }

    总结

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

    今天的更新就到这里了~

  • 相关阅读:
    MySQL8.0中你不得不知道的索引新特性
    【英语:语法基础】B7.核心语法-英文的基础时态
    Day10--配置uni-app的开发环境
    Netty第三部
    JAVA‘无效目标发行版 17’的解决方案
    小程序中如何查看会员的余额和变更记录
    Swift SwiftUI 隐藏键盘
    解决微信小程序(uniapp)中无法读取本地音频问题
    Ubuntu18.04 ROS与Anaconda兼容并且在python3的虚拟环境下与ROS通信
    从保险科技看数字化如何改变保险行业
  • 原文地址:https://blog.csdn.net/qq_32716885/article/details/127117675