在VC里实现长按键时,解决窗口不更新的问题
实现 解决 更新 窗口 vc 按键 问题
2023-09-14 09:10:36 时间
在修改一个老程序时,发现有这样一个问题,当按下一次向下或向上方向键时窗口里的数据可以向上或向下滚动一条,也会立即更新到窗口里显示。但是,当长按,不弹起按键时,就会发现数据有滚动,但窗口不更新的现象。这种现象就会给客户一种假死的感觉,体验非常不好。为了解决这个问题,仔细地看了一下VC里MFC的消息体系。
为什么一次按下再弹起就可以更新窗口呢?因为这里使用InvalidateRect函数,通知窗口有区域无效了,也就是作了一个标记,但这是Windows并不会立即更新窗口里的数据,等到弹起按键,没有操作时才会处理无效的消息。因此,按一下按键再弹起时,可以更新窗口里的内容,因为窗口后面没有其它消息处理了,可以处理无效消息。
但是当用户长按时,这时系统源源不断地产生按下按键的消息,这时虽然调用InvalidateRect函数,通知系统这个窗口无效,需要更新了,但是因为有不断的按键消息产生,导致系统并不去更新窗口,因此窗口里的数据并不会更新,但程序里计数已经在更新,这样就导致程序内部数据与窗口显示的数据不一样。
通过上面的分析,就明白了按一次和长按的差别。要解决这个问题,必须在InvalidateRect函数调用之后,再调用UpdateWindow函数,这样才可立即更新窗口,也即是让窗口重新绘制一次,这样处理之后就会发现窗口里更新的数据,与程序内部的数据保持一致。
到此,就可以完美地解决这个问题。
相关文章
- XMPP协议Asmack实现文件传输的真正解决方法
- HTML5 进阶系列:拖放 API 实现拖放排序
- Java实现 LeetCode 462 最少移动次数使数组元素相等 II
- java实现洛谷P3376【模板】网络最大流
- java实现第五届蓝桥杯信号匹配
- Java实现Catenyms(并查集+dfs+欧拉回路)
- Java实现 蓝桥杯VIP 算法提高 Torry的困惑(提高型)
- Java实现蓝桥杯VIP 算法训练 找公倍数
- 基于事件驱动的领域模型实现框架 - 分析框架如何解决各种典型业务逻辑场景
- 几种任务调度的 Java 实现方法与比较
- Atitit 微服务实践 艾提拉著 微服务主要解决几个问题负载均很 目录 1. 微服务的模式 http请求层 vs服务层1 1.1. Http vs 服务层优缺点1 2. 实现技术2
- Atitit webshell java 实现 命令行输出读取问题总结 1.1. 读取组赛 或者读取了一部分。。使用cmd /c 模式,强制关闭刷新缓冲区1 1.2. 乱码解决1 1.3. /h
- ML之多分类预测之PLiR:使用PLiR实现对六类label数据集进行多分类
- 已解决docker搜索收藏数最高的nginx镜像Python代码实现
- 【机组组合】基于Benders分解算法解决混合整数规划问题——机组组合问题(Matlab代码实现)
- 蚁群优化算法解决TSP问题(Matlab代码实现)
- 简单实现ant design pro react typescript(ts) spring boot mybatis mysql前后端登录接口 解决ant design pro登录成功无法跳转的问题
- react-router实现tab页面切换,并解决选中样式首页始终选中问题
- 利用torch.nn实现前馈神经网络解决 二分类 任务
- 利用torch.nn实现前馈神经网络解决 多分类 任务使用至少三种不同的激活函数
- 揭秘基于注册表隐藏的无文件攻击——为了实现攻击持久化,攻击者们找到新的突破口——将恶意软件实体隐藏在注册表的某个键值里
- python 私有和保护成员变量如何实现?—— "单下划线 " 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量;" 双下划线 " 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据
- 【数据结构与算法】什么是双向循环链表?以及实现过程
- html+css实现图片缓慢变大效果
- 基于JAVA实现的WEB端UI自动化 - WebDriver框架篇 - ant使用 - ant发送邮件显示源码的解决方法