经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
基于MFC实现自定义复选框效果
来源:jb51  时间:2022/2/9 11:18:14  对本文有异议

介绍

什么叫做复选框?

复选框是一种可同时选中多项的基础控件,主要是有两种明显的状态:选中与非选中。

在我们实际开发过程中,单纯的系统边框已经无法满足对界面显示需求了,这时需要采用自定义图片进行展示,那么展示效果是如何呢?

对于我们MFC框架来说,想要实现一个自定义的控件很难,一般情况下采用自绘的方式实现。对于Check控件来说,也是如此。

功能实现

复选框父类:CButton

当我们从资源视图中拖出来一个控件并绑定成员变量后,当前复选框的父类便是CButton。

这里,假设自绘的复选框类名称叫做:UICustomCheck

继承后的类框架是:

  1. class UICustomCheck : public CButton
  2. {
  3. DECLARE_DYNAMIC(UICustomCheck)
  4. public:
  5. UICustomCheck();
  6. virtual ~UICustomCheck();
  7. protected:
  8. DECLARE_MESSAGE_MAP()
  9. };

前几章我也曾经说过,MFC中控件的自绘无外乎两种情况:OnPaint自绘以及DrawItem自绘。

针对于复选框控件来说,是需要在OnPaint自绘的。

思路:根据选中的两种状态,分别显示不同的图片。

第一种情况(未选中状态),展示未选中状态图片;第二种情况(选中状态),展示选中状态图片

  1. CPaintDC dc(this);
  2. CRect rcClient;
  3. this->GetClientRect(&rcClient);
  4.  
  5. //绘制按钮的状态显示
  6. if(m_bState == 0) //未按下
  7. {
  8. if (!m_ImageUnCheck.IsNull())
  9. {
  10. m_ImageUnCheck.Draw(dc.GetSafeHdc() ,rcClient);
  11. }
  12. }
  13. else{ //按下
  14. if (!m_ImageCheck.IsNull())
  15. {
  16. m_ImageCheck.Draw(dc.GetSafeHdc() , rcClient);
  17. }
  18. }

代码讲解:

m_bState是一个bool值变量,0:未选中状态;1:选中状态

当用户设置状态更换时,此时需要更新m_bState值的数据。所以说,这里用到了函数重写功能

  1. void SetCheck(int nCheck);

该函数是属于CButton的内部函数,为了在用户设置选中状态时更新图片,此时,就需要重写该函数。

还有一种情况,用户不手动设置SetCheck函数改变状态,只是点击控件,自动更新状态,那么该如何实现呢?

在我们自绘过程中,每个自绘控件都会有鼠标的点击消息,为了实现多次点击更换图片的状态,一般都会使用OnLButtonDown或者是OnLButtonUp两个消息进行设置。

这里,我是重写的OnLButtonUp消息,鼠标抬起后更新显示状态

  1. void UICustomCheck::OnLButtonUp(UINT nFlags, CPoint point)
  2. {
  3. m_bState = !m_bState;
  4. if (this->m_hWnd != nullptr)
  5. {
  6. CWnd *pParent = this->GetParent();
  7. CRect rc;
  8. this->GetWindowRect(rc);
  9. pParent->ScreenToClient(rc);
  10. pParent->InvalidateRect(rc, TRUE);
  11. pParent->UpdateWindow();
  12. }
  13. this->Invalidate(FALSE);
  14. CButton::OnLButtonUp(nFlags , point);
  15. }

代码讲解:

每次更换图片时,不确定用户使用的是否是异形图片,所以,在更换状态时都需要获取父窗口中当前控件对应的区域,进行强制刷新。

到这里,复选框的图片替换功能就讲解结束了,功能简单,主要是在OnPaint中的绘制,以及刷新问题。

以上就是基于MFC实现自定义复选框效果的详细内容,更多关于MFC自定义复选框的资料请关注w3xue其它相关文章!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号