mfc常用控件

news2025/2/2 5:54:14

        mfc在编写桌面客户端应用应用程序,在设计界面时,如果像一般的界面,实施人员或者适配人员使用(特定的用户群体)对界面要求没有那么高,只要软件功能正常,稳定就行,我们在做这些界面时,通常使用原生的控件,其实这些控件和QT的差不多,都是些常用的控件,当然为为了界面美观,也可以自己封装界面或者皮肤库或者消息框弹框库等等,笔者这里说下基本的常用控件,这里它们的基本属性就不赘述了,那比较简单,从书上或者入门视频上都可以学到,这里说明下它们的特殊场景或者一些使用技巧吧,避免以后再踩坑。

一、CComboBox

        1.使用该控件时,如果下拉框内容过多,切记选择后,然后再设计区拖拽拉长,如果只是放置的话,它有默认高度,这样会使添加的内容显示不完全。

        2.如果需要动态变换下拉框的内容,可以先清空,然后重设,具体实例代码如下:

        这种场景一般在多级级联时需要实现这样的功能(eg:班级,人名),不同的班级有不同的人。

	while (m_comboBox.GetCount() > 0)
	{
		m_comboBox.DeleteString(0);
	}

	CString str;
	for(int i = 1; i <= GROUP_NUM; i++){
		str.Format("%d", i);
		m_comboBox.AddString("移动" + str);
		m_comboBox.SetCurSel(0);
	}

效果如下:

         3.内容过长时,可以设置tips,鼠标悬浮到其上面时,可以显示完整内容:

像上面这种,测试反手上去就是一个bug,那具体怎么做呢,比较简单:

具体实现分四部:

       3.1 声明变量:     CToolTipCtrl m_ToolTipCtrl;

       3.2 构造函数中初始化:   

            m_ToolTipCtrl.Create(this);
            m_ToolTipCtrl.Activate(TRUE); 

        3.3 消息分发函数中过滤:


BOOL CMFCWizardDlg::PreTranslateMessage(MSG* pMsg)
{
	// TODO: 在此添加专用代码和/或调用基类
	if (NULL != m_ToolTipCtrl.GetSafeHwnd())
	{
		switch (pMsg->message)
		{
		case WM_MOUSEMOVE:
			m_ToolTipCtrl.RelayEvent(pMsg);
			break;
		default:
			break;
		}
	}

	return CDialogEx::PreTranslateMessage(pMsg);
}

   3.4 内容变化时,动态设置tips内容:

void CMFCWizardDlg::OnCbnSelchangeCombo1()
{
	// TODO: 在此添加控件通知处理程序代码
	m_comboBox.GetLBText(m_comboBox.GetCurSel(), m_strComboBox);
	//增加Tip提示
	CString strTipName = m_strComboBox;
	CWnd* pWnd = GetDlgItem(IDC_COMBO1);
	m_ToolTipCtrl.AddTool(pWnd, strTipName);
}

一、CEdit

        1.只能输入固定字符(eg:只能输入数字【这当然包含正负数和零了】,有的人可能把富数忘记了);

这时就需要集成CEdit重新实现OnChar方法了,实例代码如下:

#pragma once


// CNumEdit

class CNumEdit : public CEdit
{
	DECLARE_DYNAMIC(CNumEdit)

public:
	CNumEdit();
	virtual ~CNumEdit();

protected:
	virtual BOOL PreTranslateMessage(MSG* pMsg);
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
	void setRange(double min, double max);
	bool IsSave();
	bool m_bSaveFlag;

private:
	double maxValue;
	double minValue;
};


// NumEdit.cpp : 实现文件
//

#include "../stdafx.h"
#include "NumEdit.h"


// CNumEdit

IMPLEMENT_DYNAMIC(CNumEdit, CEdit)

CNumEdit::CNumEdit()
{
	maxValue = CHAR_MAX;
	minValue = 0;
	m_bSaveFlag = false;
}

CNumEdit::~CNumEdit()
{
}


BEGIN_MESSAGE_MAP(CNumEdit, CEdit)
	ON_WM_CHAR()
END_MESSAGE_MAP()



// CNumEdit 消息处理程序
BOOL CNumEdit::PreTranslateMessage(MSG* pMsg)
{
	return CEdit::PreTranslateMessage(pMsg);
}

void CNumEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	// 保证负号只能出现一次,并且只能出现在第一个字符
	if(nChar=='-')
	{
		CString str;
		GetWindowText(str);
		// 还没有输入任何字符串
		if(str.IsEmpty())
		{
			CEdit::OnChar(nChar, nRepCnt, nFlags); 
		}
		else
		{
			int nSource,nDestination;
			GetSel(nSource,nDestination);
			// 此时选择了全部的内容
			//if(nSource==0 && nDestination == str.GetLength())
			//{
			//	CEdit::OnChar(nChar, nRepCnt, nFlags); 
			//}
			//else
			//{
			//} 
			if (0 == nSource)
			{
				CEdit::OnChar(nChar, nRepCnt, nFlags);
			}
			m_bSaveFlag = true;
		}  
	}
	// 除了负号,还允许输入数字,Backspace,Delete
	else if((nChar >= '0' && nChar <= '9')||(nChar == 0x08)||(nChar == 0x10)||(nChar == 0x16)||(nChar == 0x03)||(nChar == 0x01)) // VK_DELETE
	{
		m_bSaveFlag = true;
		CEdit::OnChar(nChar, nRepCnt, nFlags); 
	}
	// 其它的键,都不响应
	else
	{
		m_bSaveFlag = false;
	}
}

void CNumEdit::setRange(double min, double max )
{
	maxValue = max;
	minValue = min;
}

bool CNumEdit::IsSave()
{
	return m_bSaveFlag;
}

        2.默认为0,只能输入0-1000,输入其它非法数字时变成0;

        这个比较简单,本身有输入数字的属性,只不过判断其它值时将其值设置成0,(这里需要注意的是,设置完后,记得处理光标位置【特别是多个控件连锁反应判断时,需要注意处理完后,需要恢复光标位置,否则感觉光标跳转】)。

        1-1000可以使用正则:
        #define TRACE_PERIOD_REGEX "^([1-9][0-9]{0,2}|1000)$" 

        3.输入非法字符变红色(这种一般在数据库中查找,能找到说明是合法了,正常颜色,如果找不到为非法,变为红色);

        4.根据另一个输入控件的变量类型来变颜色(eg: bool int sint real lreal uint short ushort等等);

        5.和另一个CComboBox做切换效果的展示(可以使用下面两个属性,当然可以根据当前实现的是哪个控件来处理业务逻辑。

            m_beginSymbol_bool_combox.EnableWindow(FALSE);
            m_beginSymbol_bool_combox.ShowWindow(SW_HIDE);)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/104169.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSDN第16期竞赛

目录 1.比赛详情 2.竞赛感悟 3.竞赛题目回顾 &#xff08;1&#xff09;鬼画符门莲台争夺战 (2)津津的储蓄计划 &#xff08;3&#xff09;多边形的面积 (4)小桥流水人家 1.比赛详情 比赛地址&#xff1a;http://t.csdn.cn/b1Lzm 2.竞赛感悟 通过这次的周赛&#xff0c…

SQLserver技巧 年份判断,以及向上想下取整

SELECT [出厂日期],DATEDIFF(month,出厂日期,getdate())*1.0/12 as 使用年限/年 ---------得到的结果实际&#xff08;浮点&#xff09;,cast(DATEDIFF(month,出厂日期,getdate())*1.0/12 as decimal(18,1)) as 使用年限/年 FROM tableA参考&#xff1a; https://blog.csdn.…

这篇文章来告诉你几个实用的视频转文字的方法

相信大家在闲暇之余&#xff0c;都会通过一些网课来提高自己的知识本领吧&#xff01;有的时候在上网课的过程中&#xff0c;会感觉自己做笔记的速度赶不上老师的进度&#xff0c;重复观看又比较麻烦&#xff0c;这时我们就可以借助一些视频转换软件来将视频转换成文字&#xf…

元宇宙产业委共同主席倪健中:发挥元宇宙总部基地优势,探索农业元宇宙发展之路|2022首届海南自贸港(临高)乡村振兴发展论坛

12月12日&#xff0c;2022首届海南自贸港&#xff08;临高&#xff09;乡村振兴发展论坛暨经济合作洽谈周活动在临高开幕。此次活动以“精彩新临高抢滩自贸港”为主题&#xff0c;重点推介“红色”文旅、“黄色”农业、“蓝色”海洋、“绿色”金牌港和“紫色”数字经济组成的五…

【c++提高1】二叉树二叉堆(万字总结)

大纲 一、二叉树 二叉树&#xff1a;1.二叉树简介 二叉树&#xff1a;2.二叉树的性质 二叉树&#xff1a;3.二叉树的存储 二叉树&#xff1a;4.二叉树的遍历 二叉树&#xff1a;5.求解先序、后序、层次遍历序列 二叉树&#xff1a;6.例题 二、二叉堆 二叉堆&#xff1a;1.二叉堆…

Windows下NCNN环境配置(VS2019)

Windows下NCNN环境配置&#xff08;VS2019&#xff09; 本文修改自&#xff1a;Windows下ncnn环境配置&#xff08;VS2019&#xff09; 一、下载VS2019并安装 1、下载地址&#xff1a;https://visualstudio.microsoft.com/zh-hans/vs/ 2、下载后安装工作负载&#xff08;安装以…

答疑解惑:开发者必须了解的Unicode和字符编码系统

目录 前言 ASCII Unicode UTF-8 C#中的字符串类型 UTF-16 String.Length 返回的是字符个数吗&#xff1f; 问题与答案 总结 参考 前言 请大家先思考几个问题 为什么有时候页面文本全是“锟斤拷”等乱码&#xff0c;有时候是个别字符别被替换为了&#xfffd;呢&a…

2.fs文件系统模块

fs模块是Node.js官方提供的用于操作文件的模块 目录 1 导入fs模块 2 读取文件内容 fs.readFile() 2.1 读取成功 2.2 读取失败 2.3 搞个函数判定读取成功还是失败 3 写入文件内容 fs.writeFile() 3.1 写入成功 3.2 写入失败 3.3 搞个函数判定写入成功还是失败…

如何构建企业内的 TiDB 自运维体系

1. 前言 得物 App 从创立之初&#xff0c;关系型数据库一直使用的开源数据库产品 MySQL。和绝大部分互联网公司一样&#xff0c;随着业务高速增长、数据量逐步增多&#xff0c;单实例、单库、单表出现性能瓶颈和存储瓶颈。从选型和架构设计角度来看这很符合发展规律&#xff0…

[思维模式-8]:《如何系统思考》-4- 认识篇 - 什么是系统思考?系统思考的特征?系统思考的思维转变。

目录 第1章 系统思考概述 1.1 什么是系统思考 1.2 系统思考适合解决什么样的问题&#xff1f;解决复杂问题的有效利器&#xff01; 1.3 思维模式的转换&#xff1a;还原论向整体论&#xff08;西医向中医&#xff09; 第2章 系统思考的四项特征 2.1 看到全貌而非局部 2.…

ubuntu18.04+pycharm+pydesigner 配置教程(亲测可用)

文章目录系统环境pytorch 环境安装依赖包安装qtdesignerPyUICpycharm配置qtdesigner配置PyUIC配置成功如何使用参考文章&#xff1a;系统环境 ubuntu18.04 OS: Ubuntu 18.04.6 LTS Python version: 3.7 (64-bit runtime) Is CUDA available: True CUDA runtime version: 11.1…

物联网通信原理第4章 中远距离无线通信技术

目录 4.1 无线局域网&#xff08;WLAN, Wireless LAN&#xff09; 4.1.7 IEEE 802.11标准中的MAC子层&#xff08;掌握&#xff09; 1. IEEE 802.11 MAC帧格式 2. MAC层工作原理&#xff08;本章重点&#xff09; 4.4 无线局域网的扩频传输技术 4.4.1 直接序列扩频&#x…

使用inputmode改变移动端键盘弹出的类型

文章目录前言一、inputmode是什么&#xff1f;二、它有那些属性2.1 none2.2 text(默认值)2.3 numeric2.4 decimal2.5 tel2.6 search2.7 email2.8 url三、需要注意四、兼容前言 使用原因&#xff1a;需求是同时兼容移动端和PC端的输入&#xff0c;输入框数量多且绑定不同的对象…

深度学习Week11-调用官方权重进行检测(YOLOv5)

前言&#xff1a; 很早之前&#xff0c;我发过小白YOLOv5全流程-训练实现数字识别_牛大了2022的博客-CSDN博客_yolov5数字识别这篇文章&#xff0c;里面用简练语言分享用yolov5训练自己的识别器&#xff0c;但包括我在内许多人仍不了解其运行原理&#xff1b;过去两周&#xff…

Java并发——synchronized关键字

Java并发——synchronized关键字 1.synchronized作用的范围 synchronized有两种作用范围&#xff1a;对象锁和类锁 对象锁 使用方式&#xff1a; 在普通方法上加synchronized&#xff08;默认锁对象为this&#xff09;和同步代码块&#xff08;自己指定锁对象&#xff09; …

2022全年度净水器十大热门品牌销量榜单

随着人们健康意识的提升&#xff0c;每天喝足量水的观念已经深入人心&#xff0c;而伴随居民生活水平的提高&#xff0c;当下居民对水污染问题也更加关注&#xff0c;对饮水品质的认知和要求也随之升级。因此&#xff0c;净水器在过去几年开启了高速增长的趋势。 根据鲸参谋数据…

【AI with ML】第 14 章 :在 iOS 应用程序中使用 TensorFlow Lite

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

使用文档管理系统结束内容混乱

使用文档管理系统结束内容混乱 在我们目前所处的混合工作新环境中&#xff0c;数据和文档量快速增长而导致的“内容混乱”是效率和有效协作的常见障碍。管理这个问题可能是现代企业面临的最大挑战。 根据分析公司IDC发布的预测&#xff0c;2020年至2024年间创建的数据量将超过…

工控CTF之协议分析5——COTP

协议分析 流量分析 主要以工控流量和恶意流量为主&#xff0c;难度较低的题目主要考察Wireshark使用和找规律&#xff0c;难度较高的题目主要考察协议定义和特征 简单只能简单得干篇一律&#xff0c;难可以难得五花八门 常见的工控协议有&#xff1a;Modbus、MMS、IEC60870、…

PyTorch笔记 - MAE(Masked Autoencoders) PyTorch源码

欢迎关注我的CSDN:https://blog.csdn.net/caroline_wendy 本文地址:https://blog.csdn.net/caroline_wendy/article/details/128382935 Paper:MAE - Masked Autoencoders Are Scalable Vision Learners 掩码的自编码器是可扩展的视觉学习器 Kaiming He,FAIR Code:https://…