MFC之创建插入符,写字,换行与退格11

2023-10-28

概述
我们按照前面文章根据向导创建项目。

1 创建插入符

由于插入符是在创建窗口后并且做我们用户操作前需要使用。所以我们将插入符的创建放在OnCreate函数中即WM_CRATE信号。

int CInsertFuView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  在此添加您专用的创建代码
	CClientDC dc(this);
	TEXTMETRIC tm;
	dc.GetTextMetrics(&tm);//获取字体信息,以便光标开始前与其它软件写入一样
	CreateSolidCaret(tm.tmAveCharWidth / 8, tm.tmHeight);//创建插入符,CreateSolidCaret继承于CWnd,所以可以直接调用
	ShowCaret();//显示
	
	return 0;
}

结果:
在这里插入图片描述

2 写字

上面只是能将光标自适应大小放在开头,但是并不能将键盘按下的字符记录。所以下面开始写字。
目标:左键按下哪里,就在哪里开始输入字符。
2.1 写字思路

  • 1)左键按下事件,记录起始坐标。
  • 2)这是用户开始键盘输入,所以键盘事件,定义一个成员字符串变量CString,记录每次输入的单个字符。
  • 3)由于每次左键按下都有重新输入,所以需要情况上次的字符,即左键按下事件清空字符。

2.2 代码
1)左键按下事件:

void CInsertFuView::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	SetCaretPos(m_beginWritePoint);//让光标随着左键移动

	//记录鼠标左键按下开始输入字符坐标
	m_beginWritePoint = point;
	//每次按下将字符串情空
	m_contentStr.Empty();

	CView::OnLButtonDown(nFlags, point);

}

2)键盘事件

/*OnChar为键盘按下的回调函数*/
void CInsertFuView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	m_contentStr += (TCHAR)nChar;

	//显示每次输入的字符串
	CClientDC dc(this);
	CSize s = dc.GetTextExtent(m_contentStr);
	int x = m_beginWritePoint.x + s.cx;
	int y = m_beginWritePoint.y;
	SetCaretPos(CPoint(x,y));//让光标在字符串末尾

	dc.TextOutW(m_beginWritePoint.x, m_beginWritePoint.y, m_contentStr);//显示每次输入的字符串

	CView::OnChar(nChar, nRepCnt, nFlags);
}

结果可以看到,去到哪里点到哪里,并且光标可以放在最后。
在这里插入图片描述

3 换行与退格

3.1 换行的思路

  • 1)清空字符串。
  • 2)更新Y坐标。

3.2 退格的思路
利用背景色将字体全部覆盖,然后将字符串减1,最后恢复原来背景显示字符串。
具体步骤为:

//1 获取背景色
//2 设置写字的颜色,即将上面背景图颜色设置
//3 重写白色并且将字符串最后一个字符扔掉
//4 恢复颜色,否则会出现按下一个退格后字符串显示被颜色覆盖掉

将上面的键盘事件换成下面即可:


void CInsertFuView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	m_contentStr += (TCHAR)nChar;

	//显示每次输入的字符串
	CClientDC dc(this);
	TEXTMETRIC tm;
	dc.GetTextMetrics(&tm);//获取字体信息,以便光标开始前与其它软件写入一样
	//换行
	if (nChar == VK_RETURN) {
		//1 清空字符串
		m_contentStr.Empty();
		//2 更新Y坐标,但是差字体的宽度,需要重新获取字符串的信息
		m_beginWritePoint.y = m_beginWritePoint.y + tm.tmHeight;
	}
	else if (nChar == VK_BACK) {//退格
		//1 获取背景色
		COLORREF color = dc.GetBkColor();
		//2 设置写字的颜色,即将上面背景图颜色设置
		COLORREF oldcolor = dc.SetTextColor(color);
		//3 重写白色并且将字符串最后一个字符扔掉
		dc.TextOutW(m_beginWritePoint.x, m_beginWritePoint.y, m_contentStr);
		//m_contentStr = m_contentStr.Left(m_contentStr.GetLength() - 1);
		m_contentStr = m_contentStr.Left(m_contentStr.GetLength() - 2);
		//4 恢复颜色,否则会出现按下一个退格后字符串显示被颜色覆盖掉
		dc.SetTextColor(oldcolor);
	}
	else {
		m_contentStr += (TCHAR)nChar;
	}

	CSize s = dc.GetTextExtent(m_contentStr);
	int x = m_beginWritePoint.x + s.cx;
	int y = m_beginWritePoint.y;
	SetCaretPos(CPoint(x,y));//让光标在字符串末尾
	dc.TextOutW(m_beginWritePoint.x, m_beginWritePoint.y, m_contentStr);//显示每次输入的字符串

	CView::OnChar(nChar, nRepCnt, nFlags);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MFC之创建插入符,写字,换行与退格11 的相关文章

  • 微信小程序组建监听observers

    一 作用 用于监听和响应任何属性和数据字段的变化 二 限制 1 小程序基础库2 6 1开始支持 2 只能在自定义组建中使用 再页面中无法使用 三 使用 1 自定义组件的properties中的数据属性 Component 组件的属性列表 d
  • vue中使用element-ui表格table组件错行出现场景和解决方案

    在项目开发中表格错行的问题经常出现 现在整理如下 希望共同学习进步 1 element ui表格table表格内容错行 1 情况一 表格中有el tooltip时候 数据过长的时候hover 往上滑动会出现错行 解决方案 固定高度或者给出
  • 二叉树实验报告

    实验报告 实验题目 二叉树 实验目的 1 熟悉二叉树的结点类型和二叉树的基本操作 2 掌握二叉树的前序 中序和后序遍历的算法 3 加深对二叉树的理解 逐步培养解决实际问题的编程能力 基本要求 1 编写程序bitree cpp实现ADTBiT
  • java 基础重学(三)-源码阅读

    1 String 1 String定义为 final 这说明String不可继承 再看下面 String类的主力成员字段value是个char 数组 而且是用final修饰的 final修饰的字段创建以后就不可改变 是线程安全的 publi
  • python爬取软件内数据_各种数据爬取工具爬虫合集整理

    却道天凉好个秋 不用编程敲代码的爬取数据的工具合集 简单上手易用的爬虫脚本工具软件汇总 1 工具软件类 Microsoft Excel excel也可以爬一些规整的表格数据等 没想到吧 八爪鱼 一款可视化免编程的网页采集软件 可以从不同网站
  • osgexp安装与使用

    osg系列文章目录 文章目录 osg系列文章目录 前言 一 下载osgexp和3d max 二 osgexp安装 三 编译OSGExp 参考 前言 3ds max文件导出osg或者ive格式 一 下载osgexp和3d max 1 首先下载
  • 列举ADO.NET在操作数据库时,常用的对象及作用。

    connection 连接对象 用于对数据库的连接操作 参数是连接字符串 command 命令对象 用于执行对数据库的操作 参数是连接字符串或存储过程 也必须传入连接对象实例 SqlDataReader 数据读取对象 用于读取操作 Read
  • 【BP时序预测】基于BP神经网络的时间序列预测附matlab完整代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 内容介绍 基于BP神经网络的时间序列预测是一种常用的预测方法 它可以通过训练神经网络模型来学习
  • Ubuntu 18.04安装RTX2080Ti显卡驱动

    Ubuntu 18 04 2080Ti安装显卡驱动 PPA仓库安装 网上的方法太多了 尝试了几种各种失败 这里记录一种本人电脑有效的方法 有的电脑需要先卸载Ubuntu 自带的驱动 sudo add apt repository ppa g

随机推荐

  • unity 获取鼠标停留处UI

    修改新华社项目 需要为鼠标停留加个标示 暂定为旋转UI 的fillAmount 期间需要获得UI名字 因为名字太多了 个别环影响 所以找到了这个工具方法
  • 如何在你的windows系统电脑里面设置个人私密空间

    1 前几天我在网上搜了一下windows系统的垃圾清理软件看看哪个好用 2 诶 还别说 还真的找到了一个好用的 他就是 完美卸载 最麻烦就是这些杀毒 清理类的软件 所以我下载了个不需要安装的绿色版 3 我要介绍的就是里面的 数据保险箱 界面
  • 利用SCCM进行横向移动

    01SCCM介绍 SCCM全名为System Center Configuration Manager 从版本1910开始 微软官方将其从Microsoft System Center产品移除 重新命名为Microsoft Endpoint
  • 9种基本数据类型

    9种基本数据类型以及封装类 基本类型 大小 默认值 封装类 byte 1 byte 0 Byte short 2 short 0 Short int 4 0 Int Long 8 0L Long float 4 0 0f Float dou
  • 跳过交货单ATP CHECK的方法

    物料启用ATP CHECK会影响到交货 对于那些启用了ATP CHECK而又没有做合理规划的系统 想要搞清楚ATP是如何计算的 我只能说呵呵 你会发现批次拆分 过账的BAPI会有莫名其妙的 报错 搞不清楚库存里明明有东西为什么还不让交货 这
  • 【深度学习】数据集打标签:生成train.txt和val.txt

    当我们在Github上下载一篇论文的代码后 我们如何在自己的数据集上进行复现呢 准备自己的数据集 这是在百度爬的十分类的服装数据集 其中train文件夹下每类大概300张 val文件夹下每类大概100张 总共在4000张左右 设置目录 我们
  • mysql二进制文件下载教程_mysql 二进制文件增量备份

    1 首先在my cnf下添加二进制文件路径 windows下文件名称为my ini 在 mysqld 下添加 log bin mysql bin 2 centos下默认安装mysql 5 6 数据默认文件夹下为 var lib mysql
  • (新手向)在matlab中运用SMOTE和前馈神经网络对wilt(枯萎)数据集进行机器学习

    目录 一 概述 二 数据集描述 三 方法 数据预处理 SMOTE算法 Feed forward网络 四 结果 后记 2021年5月 一 概述 近日 有位同学因为搞不懂matlab中的神经网络来问我怎么做 我说你把数据集发来给我看看 我稍微一
  • apt安装包报错解决办法:下列软件包有未满足的依赖关系,依赖。。。但是。。。正要被安装

    apt安装包报错解决办法 下列软件包有未满足的依赖关系 依赖 但是 正要被安装 文章目录 apt安装包报错解决办法 下列软件包有未满足的依赖关系 依赖 但是 正要被安装 几种可能的情况 1 镜像源版本代码的问题 1 查看版本代码 2 修改镜
  • Redis设计与实现---Sentinel

    Sentinel Redis的高可用性解决方案 由一个或多个Sentinel实例组成的系统可以监视任意多个主服务器 以及这些主服务器属下的所有从服务器 并在被监视的主服务器进入下线状态时 自动将下线主服务器属下的某个从服务器升级为新的主服务
  • 考研复试数据库原理课后习题(十)——数据库恢复技术

    数据库恢复技术 1 事务是用户定义的一个数据库操作序列 这些操作要么全做 要么不做 是一个不可分隔的工作单位 事务具有四个特性 ACID 原子性 一致性 隔离性 持续性 原子性 事务是数据库的逻辑工作单位 一个事务中包括的操作要么全做 要么
  • Swagger的常用配置

    一 可在项目中创建SwaggerConfig配置类 对文档详细信息进行配置 swagger配置类 用于配置swagger的详细信息 比如标题 网站 邮箱 Configuration public class SwaggerConfig 返回
  • linux 大量的TIME_WAIT解决办法

    原文地址 http www cnblogs com softidea p 6062147 html 统计在一台前端机上高峰时间TCP连接的情况 统计命令 netstat n awk tcp S NF END for a in S print
  • 计算机科学想象作文500,六年级想象作文600字

    第一篇 描写月亮的作文 你们听说过 超级月亮 吗 什么 没听说过 那么 我就带你们去看看前几天的超级月亮吧 今天 我像往常一样去广场滑滑板 忽然 我看一栋楼房的左 作文500字 未来的城市一场暴雨过后 阳光洒在充满绿意的城市 街道上没有积水
  • 09_Pandas从多个条件(AND,OR,NOT)中提取行

    09 Pandas从多个条件 AND OR NOT 中提取行 使用Pandas从多个条件 AND OR NOT 中提取行的方法 有以下2点需要注意 的使用 and or not的错误 使用比较运算符时 请将每个条件括在括号中 以下数据为例
  • 驱动名、设备名和设备文件名的关系

    编写一个驱动文件的时候生成一个name1 ko文件 这个name1就是驱动名 使用insmod name1 ko指令之后 用lsmod能看见一个名为name1的驱动 在调用了alloc chrdev region函数或register ch
  • 满分回答教你如何应对面试中项目经验这一难关

    给前端瓶子君加星标 提升前端技能 作者 亦逊 https juejin im post 5e7aed9c6fb9a07cac1d872d 前言 本篇文章的作者是来自阿里淘系用户增长前端团队的 亦逊 18年作为双非本科生通过层层面试 校招进入
  • CSS下划线与文字间距,下划线粗细以及下划线颜色的设置

    最开始的时候了解下划线的属性是 text decoration underline 1 但是 很遗憾的是 对于设计做的下划线用浏览器默认属性样式很难调整 使用这个属性并不能调整下划线与文字的间距 而且对于下划线的颜色也不好调整 而使用 u
  • 2014年仍然是DX11设备仿真和软引擎年

    先说点题外话 2014年1月比较浮躁 2月过年 回家后 与亲戚家的同龄人一比较 发现自己很废 不知道他们是不是在吹牛 想急功近利挣点钱 所以一度想进行OSG或者COCOS2DX 诚然 以后会进行这样的一种或两种 但是 今年不是时候 因为水平
  • MFC之创建插入符,写字,换行与退格11

    概述 我们按照前面文章根据向导创建项目 1 创建插入符 由于插入符是在创建窗口后并且做我们用户操作前需要使用 所以我们将插入符的创建放在OnCreate函数中即WM CRATE信号 int CInsertFuView OnCreate LP