基于MFC实现自定义复选框效果

目录
  • 介绍
  • 功能实现

介绍

什么叫做复选框?

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

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

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

功能实现

复选框父类:CButton

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

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

继承后的类框架是:

class UICustomCheck : public CButton
{
	DECLARE_DYNAMIC(UICustomCheck)
public:
	UICustomCheck();
	virtual ~UICustomCheck();
protected:
	DECLARE_MESSAGE_MAP()
};

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

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

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

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

CPaintDC  dc(this);
CRect   rcClient;
this->GetClientRect(&rcClient);

//绘制按钮的状态显示
if(m_bState == 0) //未按下
{
	if (!m_ImageUnCheck.IsNull())
	{
		m_ImageUnCheck.Draw(dc.GetSafeHdc() ,rcClient);
	}
}
else{ //按下
	if (!m_ImageCheck.IsNull())
	{
		m_ImageCheck.Draw(dc.GetSafeHdc() , rcClient);
	}
}

代码讲解:

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

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

void	SetCheck(int nCheck);

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

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

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

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

void UICustomCheck::OnLButtonUp(UINT nFlags, CPoint point)
{
 	m_bState = !m_bState;
  	if (this->m_hWnd != nullptr)
	{
		CWnd *pParent = this->GetParent();
		CRect rc;
		this->GetWindowRect(rc);
		pParent->ScreenToClient(rc);
		pParent->InvalidateRect(rc, TRUE);
		pParent->UpdateWindow();
	}
  	this->Invalidate(FALSE);
	CButton::OnLButtonUp(nFlags , point);
}

代码讲解:

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

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

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

(0)

相关推荐

  • MFC对话框实现梯形分页

    本文实例为大家分享了MFC对话框实现梯形分页的具体代码,供大家参考,具体内容如下 // MFCDlg.h: 头文件 // #pragma once #include "CMemoCtrl.h" // CMFCDlg 对话框 class CMFCDlg : public CDialogEx { // 构造 CMemoCtrl m_Memo; public: CMFCDlg(CWnd* pParent = nullptr); // 标准构造函数 // 对话框数据 #ifdef AFX_DE

  • MFC对话框中实现走马灯效果

    本文实例为大家分享了MFC对话框中实现走马灯,文字信息循环播放显示效果,供大家参考,具体内容如下 CMFCDlg.h 对话框 // CMFCDlg.h 对话框 class CMFCDlg : public CDialogEx { // 构造 public: CMFCDlg(CWnd* pParent = nullptr); // 标准构造函数 // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_DLG_M }; #endif // 实现 protec

  • MFC对话框自定义消息映射的方法

    本文实例讲述了MFC对话框自定义消息映射的方法.分享给大家供大家参考.具体实现方法如下: 1.定义消息: 复制代码 代码如下: #define WM_MYMSG (WM_USER+100) 2.定义消息响应函数: LPESULT CSLYARDlg::OnMymsg(WPARAM wParam, LPARAM lParam) { // TODO return 0; } 3.在窗口类头文件的AFX_MSG中声明消息响应函数: // Generated message map functions /

  • MFC实现对话框编辑控件上拖拽文件

    本文实例为大家分享了MFC实现对话框编辑控件上拖拽文件的具体代码,供大家参考,具体内容如下 步骤 1.重载CEdit类 2.添加编辑框控件 首先,重载CEdit类,定义一个派生类CDragEdit类,并重载它的WM_CREATE方法,在其中添加DragAcceptFile(TRUE); 方法. // CDragEdit.h #pragma once class CDragEdit : public CEdit { DECLARE_DYNAMIC(CDragEdit) public: CDragE

  • MFC模拟实现自定义消息发送

    目录 自定义消息 第一步:定义自定义消息名称以及ID 第二步:发送自定义消息 第三步:自定义消息映射 第四步:自定义消息实现 模拟系统消息 wParam参数 LPARAM参数 在MFC框架下,有很多系统已经定义好的消息,例如ON_WM_LBUTTONDOWN().ON_WM_MBUTTONDOWN()等等.我们在使用的时候只需要声明并调用就可以了,最简单的用法. 提升了一点难度的用法就是自己设置自定义消息,再提升一点难度的就是如何模拟系统消息了,一般情况下只是做普通的项目开发功能是用不到的. 在

  • 基于MFC实现自定义复选框效果

    目录 介绍 功能实现 介绍 什么叫做复选框? 复选框是一种可同时选中多项的基础控件,主要是有两种明显的状态:选中与非选中. 在我们实际开发过程中,单纯的系统边框已经无法满足对界面显示需求了,这时需要采用自定义图片进行展示,那么展示效果是如何呢? 对于我们MFC框架来说,想要实现一个自定义的控件很难,一般情况下采用自绘的方式实现.对于Check控件来说,也是如此. 功能实现 复选框父类:CButton 当我们从资源视图中拖出来一个控件并绑定成员变量后,当前复选框的父类便是CButton. 这里,假

  • jQuery.Sumoselect插件实现下拉复选框效果

    简单介绍 jquery.sumoselect是一款跨设备.跨浏览器的jQuery下拉列表框插件.该jQuery下拉列表框插件可以单选,也可以多选.它的样式可以通过CSS文件来自定义.它的最大特点是可以跨设备使用,所有设备上功能都是一致的. 该jQuery下拉列表框插件的特点有: 可以进行单选,也可以进行多选. 可以通过CSS文件来自定义样式. 支持绝大多数的设备. 根据设备智能渲染. 在Android.IOS.Windows和其它设备上会自动渲染出该设备原生样式的下拉列表框. 可以自定义提交数据

  • 微信小程序自定义复选框

    本文实例为大家分享了微信小程序自定义复选框的具体代码,供大家参考,具体内容如下 1.效果 2.wxml <checkbox-group bindchange="checkboxChange" class="checkbox-group">      <view wx:for="{{checkboxArr}}" wx:key="index" class="padding-xs">   

  • jquery模拟多级复选框效果的简单实例

    今天又次体会到jquery的强大了,做了个多级复选框的效果,代码总共就20+行就over了. 我又想用js来做一个看看,才写了几个方法就写不动了,兼容性要考虑很多,而且代码量直线上升. 主要分享下jquery的这个效果的实现.代码块分两块: 一是全选的效果,就是点击全选的复选框时它的子孙都相应被选中或者未选中.这个很好做,代码如下: evtEle.parent().next(".checks").find("input:checkbox").attr("c

  • 基于vue v-for 循环复选框-默认勾选第一个的实现方法

    应用场景:在进行多选的时候一般默认显示第一个. 实现方法:纯vue实现 例子: <span v-for="(one,index) in site"><input type="checkbox" :checked="index == 0" style="vertical-align: middle;"><label>{{one.name}}</label></span>

  • 微信小程序 自定义复选框实现代码实例

    功能: 1.需要多选复选框,并且可以上拉滚动: 2.需要通过名称手写字母排序的,并且可以上拉滚动: 常规的小程序自带的原生picker无法满足我们的要求,因此一些特殊效果需要我们自定义来实现,废话不多说,我们直接看效果: index.wxml布局 <view class="container"> <view class='class bgFFF' bindtap='isDep'> <view class='class-text'> <text

  • 模拟多级复选框效果的jquery代码

    今天又次体会到jquery的强大了,做了个多级复选框的效果,代码总共就20+行就over了. 我又想用js来做一个看看,才写了几个方法就写不动了,兼容性要考虑很多,而且代码量直线上升. 主要分享下jquery的这个效果的实现.代码块分两块: 一是全选的效果,就是点击全选的复选框时它的子孙都相应被选中或者未选中.这人很好做,代码如下: 复制代码 代码如下: evtEle.parent().next(".checks").find("input:checkbox").a

  • 微信小程序实现复选框效果

    本文实例为大家分享了微信小程序实现复选框片展示的具体代码,供大家参考,具体内容如下 样式部分你们自由发挥,反正这里是什么都没写的,选中和没选中直接用这个this.data.arrStatus[checkIndex]去判断就行了,之后你们都懂的. 效果预览: js部分 // page/index/index.js Page({ /** * 页面的初始数据 */ data: { items: [ { name: 'USA', value: '美国' }, { name: 'CHN', value:

  • 基于javascript实现checkbox复选框实例代码

    本文实例讲解了javascript实现checkbox复选框的详细代码,分享给大家供大家参考,具体内容如下 效果图: 具体代码: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>无标题文档</title> <script type="text/javascr

  • Js自定义多选框效果的实例代码

    前端入坑纪 27 工作中的一个多选效果,感觉不算太难,就上传来分享下. 以上图文,纯属测试,如有雷同,请勿当真 HTML 结构 <div id="selexWps" class="seletProds clear"> <div> <span>积分<em>5000</em></span> ![](wrap/img/pic.png) <p>请选择</p> </div&g

随机推荐