当前位置: 首页 > article >正文

第4章,[标签 Win32] :SysMets3 程序讲解01

专栏导航上一篇第4章[标签 Win32] SysMets3 程序代码回到目录下一篇第4章[标签 Win32] SysMets3 程序讲解02iVertPos本节前言对于本节所讲解的知识有可能你会需要时不时地参考本专栏的其它文章。真的遇到了需要参考之前的文章的知识点请你自行查阅。我呢也会提到一部分的参考课节。但是呢你不应该依赖于我的主动提及。最好呢你自己能够多去了解和查看本专栏目录。本节内容一部分内容来自于对佩措尔德原教材的大段抄录也有一部分是我的原创。我们开始本节的学习。一. SysMets3 程序讲解这里我们依赖 Windows 来维护滚动条信息和做边界检查。在处理 WM_VSCROLL 和 WM_HSCROLL 时首先获取滚动条消息根据通知码调整位置然后调用 SetScrollInfo 函数设置位置。程序然后调用 GetScrollInfo 。如果在调用 SetScrollInfo 时位置超出了范围Windows 将自动修正位置并通过 GetScrollInfo 调用返回正确的位置。SysMets3 使用 ScrollWindow 函数来滚动窗口客户区的内容而不是重绘。尽管这个函数相对复杂在新版本中的 Windows 中被更复杂的ScrollWindowEx 取代在 SysMets3 中的应用却是很简单的。该函数的第二个参数指定了客户区水平滚动多少个像素第三个参数是客户区垂直滚动的像素数。ScrollWindow 的最后两个参数设为 NULL表示需要滚动整个客户区。Windows 自动将新滚动出现的地方无效化从而产生一条 WM_PAINT 消息。这里并不需要调用 InvalidateRect 函数。需要注意的是ScrollWindow 并不是 GDI 函数因为它并不需要设备环境句柄作为参数。这是少数几个能够改变窗口的客户区现实的非 GDI 函数之一。在 Windows 文档中为了便于查找它和滚动条函数放在一起。在这里我略微地来讲一讲 ScrollWindow 函数。在 SysMets3 的行号 159 到 164 的位置有如下代码。if (si.nPos ! iVertPos) { ScrollWindow(hwnd, 0, cyChar * (iVertPos - si.nPos), NULL, NULL); UpdateWindow(hwnd); }截图如下。图1在 SysMets3 里面iVertPos 变量是在窗口过程函数中声明的一个局部变量。图1 所示的代码是 WM_VSCROLL 消息中的一段处理代码。在 WM_VSCROLL 消息的处理代码中首先用下图所示的代码获取垂直滚动条的原来的信息。图2尤其是通过图2 的红色框线所示的代码行将滚动条原来的位置给保存了下来。在 WM_VSCROLL 中图2 所在代码行的随后的代码是根据收到的滚动条消息如 SB_LINEUP、SB_LINEDOWN、SB_PAGEUP、SB_THUMBTRACKPOS 等调整 si.nPos 的值。根据收到的滚动条消息调整了 si.nPos 的值以后用这个新的 si.nPos去设置滚动条的新的位置并通过调用 GetScrollInfo 函数再次获取滚动条信息如下图所示。图3这个时候新获取的滚动条消息中si.nPos 包含了滚动条的新位置值而 iVertPos 则是包含了滚动条的旧位置值。在这种情况下我们再次来看图1 。图1副本假定滚动条原来的位置是3新位置是4也就是iVertPos 等于 3si.nPos 等于 4。在这种情况下iVertPos-si.nPos 的值是负的因而【cyChar * (iVertPos - si.nPos)】的值也是负的。在图1 中【cyChar * (iVertPos - si.nPos)】实参位于 y 的位置上而 x 参数的实参是 0因此在图1 的 ScrollWindow 函数的作用之下客户区的内容在横向方面无论作滚屏操作因为 ScrollWindow 的 x 位置的值是 0 。在垂直方向上需要让屏幕卷动的长度是【cyChar * (iVertPos - si.nPos)】的绝对值。那么究竟是将屏幕内容向上滚动还是向下滚动呢我们可以测试一下代码也就是可以单击滚动条的下面的向下三角号或者在滚动条滑块的下方单击一下这都会导致代码运行到图1 时iVertPos 的值小于 si.nPos 的值从而【cyChar * (iVertPos - si.nPos)】为负。单击滚动条内部下方的向下三角号或者在滚动条滑块下方单击一下都会导致客户区的内容相对于屏幕向上卷动。假定代码运行到图1 时iVertPos 等于 3而 si.nPos 等于 4这是用单击滚动条下方的向下三角号可以达到的一种效果。在这种情况下客户区的原本的第 10 行会变到第 9 行原本的第 9 行会变到第 8 行原本的第 8 行会变到第 7 行其余的依次类推。也就是在调用 ScrollWindow 时它会导致客户区内容的滚屏操作。在 x 参数为 0 的情况下横方向不会作滚屏操作或者是滚动得长度为 0 像素。在 y 参数不为 0 的情况下垂直方向上就需要作出滚屏操作了。当 x 为 0而 y 参数小于 0 的情况下客户区的内容相对于屏幕向上卷动。假定只滚动一行内容则客户区原本的第 6 行内容会变到第 5 行原本的第 5 行内容会变到第 4 行原本的第 4 行内容会变到第 3 行其余行数的变动情况依次类推。换一个角度来看屏幕倾向于显示原显示内容下面的内容。假定 iVertPos 等于 3si.nPos 等于 4页面大小为 10这种情况里原来显示的是文档 3 到 12 行的内容则新的显示内容就会是文档 4 到 13 行的内容。原来的显示中文档 3 行内容居于客户区的顶行也就是 0 行。而新的显示结果中文档 4 行的内容会居于客户区 0 行。单击垂直滚动条下方的向下三角号会有此效果。当 x 为 0而 y 参数大于 0 的情况下客户区的内容相对于屏幕向下卷动。假定只滚动一行内容则客户区原本的第 6 行内容会变到第 7 行原本的第 7 行内容会变到第 8 行原本的第 8 行内容会变到第 9 行其余行数的变动情况依次类推。换一个角度来看屏幕倾向于显示原显示内容上面的内容。假定 iVertPos 等于 6si.nPos 等于 5页面大小为 10。这种情况里原来显示的是文档 6 到 15 行的内容则新的显示内容就会是文档 5 到 14 行的内容。原来的显示中文档 15 行内容居于客户区的底行。而新的显示结果中文档 14 行的内容会居于客户区底行。单击垂直滚动条上方的向上三角号会有此效果。说完了 y 的情况以后再来说 x 的情况。假定 y 为 0x 小于 0这种情况下客户区的内容会相对于屏幕向左卷动。假定只卷动一列字符则原本的第 9 个字符会变到第 8 个字符的位置原本的第 8 个字符会变动第 7 个字符的位置原本的第 7 个字符会变到第 6 个字符的位置。换一个角度来看屏幕倾向于显示原内容右边的内容。假定原来显示的是文档的第 6 个字符到第 15 个字符的内容则新的显示内容是文档第 7 个字符到第 16 个字符的内容。原来的显示内容中第 6 个字符居于客户区最左边。新的显示内容中第 7 个字符居于客户区最左边。单击水平滚动条右方的向右三角号会有此效果。假定 y 为 0x 大于 0这种情况下客户区的内容会相对于屏幕向右卷动。假定只卷动一列字符则原本的第 9 个字符会变到第 10 个字符的位置原本的第 10 个字符会变动第 11 个字符的位置原本的第 11 个字符会变到第 12 个字符的位置。换一个角度来看屏幕倾向于显示原内容左边的内容。假定原来显示的是文档的第 6 个字符到第 15 个字符的内容则新的显示内容是文档第 5 个字符到第 14 个字符的内容。原来的显示内容中第 15 个字符居于客户区最右边。新的显示内容中第 14 个字符居于客户区最左边。单击水平滚动条左方的向左三角号会有此效果。关于 ScrollWindow 函数我就先讲到这里了。我们接着往下看。WM_HSCROLL 消息处理截获了 SB_THUMBPOSITION 通知码但是忽略了 SB_THUMBTRACK 。这样如果用户水平拖动滚动条的滑块程序只有在用户松开了鼠标键时才会水平滚动窗口的内容。WM_VSCROLL 消息处理有所不同它截获了 SB_THUMBTRACK 消息而忽略了 SB_THUMBPOSITION 。这样当用户拖动垂直滚动条的滑块时程序相应地滚动窗口的内容。这样更符合用户的期待需要小心的是一旦用户发现程序对他们的鼠标操作反应迅速他们会拼命地使用滚动条来看程序是否跟得上。所幸今天的电脑对此能够应对自如。而如果需要在慢速电脑上运行你的程序你可以考虑在 GetSystemMetrics 中使用 SB_SLOWMACHINE 参数。另一个加快 WM_PAINT 处理的方法也用在了 SysMets3 中在 WM_PAINT 代码中程序确定哪些行落在了无效矩形中并且只重绘那些行。这样的代码更复杂但是更快。二. 可我不想用鼠标在早期的 Windows 时代很多用户并不使用鼠标而且 Windows 本身和许多的应用程序并不是必须有鼠标才能运行。尽管到了今天没有鼠标的 PC 很少见了但我仍然建议你的程序最好能用键盘模拟鼠标操作。这对于滚动条更为合适。因为在键盘上有一组方向键应该能够提供相应的功能。在第 6 章里我们将学习怎样使用键盘怎样在程序中加入键盘接口。你看到了在 SysMets3 中WM_VSCROLL 消息处理似乎处理了 SB_TOP 和 SB_BOTTOM 通知码。我早先提到窗口过程不会从滚动条收到这些消息所以目前来看这些代码是多余的。但是在第 6 章里当我们回过头来再看这个程序时你会明白这么做的原因。结束语关于 SysMets3我们还有许多需要讲解的地方。在我第一次学习这个代码的时候我是费了一点儿劲的。SysMets3 和 SysMets2都是使用滚动条的代码而更换了滚动条函数以后新的 SysMets3比旧的 SysMets2是难了好多。如果你本身的逻辑思维能力比较强那么不需要我的太多的讲解你基本上是能够看懂程序代码的。通过调试观察程序运行结果你是可以自己搞懂这个程序代码的。然而作为讲解者来讲我还是需要多作一些讲解以便说即使你本身的逻辑思考能力没那么强也可以看懂本程序。后面我将会再挑出几段程序代码来作出讲解。作为学习者的你你不应该依赖于我的讲解最好呢还是自己努力地去思考程序。而作为讲解者的我还是应该尽量地去细致讲解代码讲清楚难点知识而不应该依赖于学习者有着超凡的逻辑思考能力。我们彼此都加油吧。争取能够一起学好 Windows 程序设计知识。专栏导航上一篇第4章[标签 Win32] SysMets3 程序代码回到目录下一篇第4章[标签 Win32] SysMets3 程序讲解02iVertPos

相关文章:

第4章,[标签 Win32] :SysMets3 程序讲解01

专栏导航 上一篇:第4章,[标签 Win32] :SysMets3 程序代码 回到目录 下一篇:第4章,[标签 Win32] :SysMets3 程序讲解02,iVertPos 本节前言 对于本节所讲解的知识,有可能&#xf…...

3步掌握B站视频下载:解锁大会员4K高清内容

3步掌握B站视频下载:解锁大会员4K高清内容 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader Bilibili-downloader是你获取B站…...

手把手教你学<基于 Linux 的 NPU 协处理器固件开发>专栏第1章 入门:

1.2 典型 AI 芯片架构:主核 Linux + NPU 协处理器 在上一节我们明确了NPU是依附于Linux主核的专用AI协处理器,属于主从配合的工作模式,这一节我们就深入拆解端侧AI芯片最主流的“Linux主核+NPU协处理器”异构架构。结合大家日常接触的代码仓库管理、编译脚本执行、固件烧录…...

LeetCode Hot 100 | 滑动窗口专题(C++ 题解)

LeetCode Hot 100 | 滑动窗口专题(C 题解) 滑动窗口是处理连续子数组/子字符串问题的核心技巧,通过维护一个可变窗口来避免重复计算,将 O(n) 的暴力枚举优化到 O(n)。本文涵盖 LeetCode Hot 100 中 2 道经典滑动窗口题目&#xff…...

ArduinoLog:面向MCU的零开销C++嵌入式日志框架

1. ArduinoLog 项目概述ArduinoLog 是一款专为 Arduino 及兼容嵌入式平台(包括 AVR、SAM、ESP8266 等)设计的轻量级 C 日志框架。其核心设计哲学是“零运行时开销、零动态内存分配、全编译期可控”,在资源极度受限的微控制器环境中&#xff0…...

UEFI SCT编译调试踩坑记:我的AARCH64环境搭建与问题解决实录

UEFI SCT编译调试实战:AARCH64环境搭建与疑难问题全解析 当你在深夜的办公室里盯着屏幕上闪烁的光标,第N次尝试编译UEFI SCT测试套件时,那种既熟悉又陌生的挫败感再次袭来。作为UEFI开发者,我们都经历过这样的时刻——官方文档看似…...

SEO_新手必看的SEO优化入门教程与常见误区

什么是SEO优化? SEO优化,全称搜索引擎优化,是指通过优化网站内容和结构,使其在搜索引擎(如百度、谷歌)中获得更高排名的一系列活动。SEO的目的是提高网站的自然流量,从而增加潜在客户和销售机会…...

Go语言中的Panic和Recover:错误处理的艺术

Go语言中的Panic和Recover:错误处理的艺术 1. Panic和Recover的基本概念 Panic和Recover是Go语言中用于处理异常情况的机制。Panic用于在程序遇到无法恢复的错误时终止程序,而Recover用于捕获Panic并恢复程序的正常执行。 Go语言的错误处理哲学是显式处理…...

TCC性能瓶颈到底卡在哪?:用Arthas+Metrics精准定位4大隐性耗时源并实测压降67%

第一章:TCC性能瓶颈到底卡在哪? TCC(Try-Confirm-Cancel)模式虽能保障分布式事务的强一致性,但其性能损耗远高于本地事务——根本原因并非网络延迟本身,而是其固有的三阶段协同机制与资源生命周期管理带来的…...

Seqlist 顺序表 的实现c语言

本小结重点: 你将学到 函数基础 传值传地址的区别结构体指针 简单循环控制 理解物理结构与存储结构的区别多文件分布 简单来说就是对动态数组进行函数封装,简化了很多功能所以很多就是对数组的利用,但更多是对结构体数组,所…...

Phi-4-mini-reasoning案例分享:用逻辑题测试模型对‘必要条件’的理解深度

Phi-4-mini-reasoning案例分享:用逻辑题测试模型对必要条件的理解深度 1. 模型能力定位 Phi-4-mini-reasoning是专为推理任务优化的文本生成模型,其核心优势在于处理需要多步逻辑推导的问题。与通用对话模型不同,它更擅长处理以下类型任务&…...

Super IO:提升Blender批量处理效率的自动化流程解决方案

Super IO:提升Blender批量处理效率的自动化流程解决方案 【免费下载链接】super_io blender addon for copy paste import / export 项目地址: https://gitcode.com/gh_mirrors/su/super_io 在3D设计工作流中,设计师常常面临文件格式转换繁琐、跨…...

Ray Optics:面向未来的光学仿真平台——从零开始的光学建模实践

Ray Optics:面向未来的光学仿真平台——从零开始的光学建模实践 【免费下载链接】ray-optics A web app for creating and simulating 2D geometric optical scenes, with a gallery of (interactive) demos. 项目地址: https://gitcode.com/gh_mirrors/ra/ray-op…...

ZGC停顿时间为何突然飙升?3个被90%团队忽略的配置雷区曝光

第一章:ZGC停顿时间为何突然飙升?3个被90%团队忽略的配置雷区曝光 ZGC(Z Garbage Collector)以亚毫秒级停顿著称,但生产环境中频繁出现 10–50ms 甚至更高停顿,往往并非内存压力所致,而是源于几…...

【数据结构】树的定义、核心术语与关键性质全解析

在数据结构的世界里,树(Tree) 是一种极其重要的非线性结构,它完美模拟了自然界中树的层次关系,从文件系统、组织结构,到算法中的二叉搜索树、堆,再到 AI 中的决策树,树的身影无处不在…...

超级障碍马术联赛(PJL)正式启动,设立创纪录的3亿美元保底奖金池,开启障碍马术运动新纪元

• PJL助力骑手以全职职业运动员身份参赛,同时为这项运动构建可持续的经济模式。 • PJL由McCourt Global支持,核心管理团队拥有数十年马术赛事、体育和娱乐行业经验,为顶级障碍马术赛事树立全新、可持续且具备全球影响力的标准。 • 2027年3…...

软件实施交付转运维学习第三天:Linux系统命令基础(部分)

从实施到运维的蜕变之路,掌握命令就是掌握Linux的灵魂写在前面作为一名从软件实施交付转向运维的工程师,我深刻体会到:Linux命令不仅仅是简单的指令,更是与操作系统对话的语言。当我们站在实施和运维的交界处,掌握Linu…...

告别手动操作!Open-AutoGLM部署教程,让AI接管你的手机

告别手动操作!Open-AutoGLM部署教程,让AI接管你的手机 1. 引言:AI手机助手的革命性突破 想象一下这样的场景:早上醒来,你只需要对手机说"帮我点一杯星巴克燕麦拿铁,加双份浓缩,送到公司&…...

中兴光猫配置解密工具:突破运营商限制,掌握家庭网络自主权

中兴光猫配置解密工具:突破运营商限制,掌握家庭网络自主权 【免费下载链接】ZET-Optical-Network-Terminal-Decoder 项目地址: https://gitcode.com/gh_mirrors/ze/ZET-Optical-Network-Terminal-Decoder 在家庭网络管理中,你是否曾因…...

Axelspace 太空公司牵头联合体入选日本太空战略基金项目 “提升下一代地球观测卫星能力技术”

—— 通过卫星星座与航空器开展特定排放源二氧化碳排放与吸收监测,打造气候解决方案,开拓全新市场机遇 Axelspace 太空公司、明星电气株式会社、全日空控股株式会社及 JIJ 株式会社联合宣布,各方共同申报的技术研发项目成功入选日本宇宙航空…...

【linux】linux权限的详细讲解

一、Linux 权限的概念 1.1、用户分类 Linux下有两种用户:超级用户 (root) 与 普通用户超级用户:可以再linux系统下做任何事情,几乎不受权限的限制; 普通用户:在linux下做权限范围内的事情; 超级用户的命令提…...

【AI编程工具系列:第13篇】华为CodeArts与豆包MarsCode实战:企业级AI编程工具深度对比

摘要 本文全面对比分析华为CodeArts和豆包MarsCode两款企业级AI编程工具。华为CodeArts凭借三层融合架构(AI原生IDE集成层、代码智能体引擎层、Codebase语义索引系统层),在安全合规、信创兼容和私有化部署方面表现卓越,代码补全延…...

【读书笔记】《如何做到爱孩子也被孩子爱》

《如何做到爱孩子也被孩子爱》作者:法国著名心理学家(著有《你好,焦虑分子》)核心框架:爱、理性与逻辑 本书提出教养孩子的三大抓手,缺一不可: 爱 → 带来丰富情感与能量,让孩子将来…...

【读书笔记】《在远远的背后带领》

《在远远的背后带领》书话整理书名由来 "在远远的背后带领"这个书名,源于作者对十余年养育实践的回顾与思考。她发现,父母养育孩子容易走两个极端: 过度控制:强迫孩子按照自己的想法行事,结果双方俱疲&#…...

windows版vasp-6.5.1非Cygwin版

推荐使用oneapi版本,这个版本性能要好一点。 1.解压压缩包。 Gromacs&Vasp软.件.交.流:962946828 2.用VASP安装器添加系统环境变量(选择bin目录所在目录的父级目录)。 3.测试命令(在cmd或者powershell执行&#…...

Graphormer开源模型部署教程:3.7GB小模型+RTX4090一键启动分子建模服务

Graphormer开源模型部署教程:3.7GB小模型RTX4090一键启动分子建模服务 1. 项目介绍 Graphormer是一种基于纯Transformer架构的图神经网络模型,专门为分子图(原子-键结构)的全局结构建模与属性预测而设计。这个3.7GB的小模型在OG…...

2026年Java面试最常被问的1000道题目及参考答案

Java学到什么程度可以面试工作? 要达到能够面试Java开发工作的水平,需要掌握以下几个方面的知识和技能: 1. 基础扎实:熟悉Java语法、面向对象编程概念、异常处理、I/O流等基础知识。这是所有Java开发者必备的基础,也…...

【人生底稿 03】2012 末日传说与我踏入 IT 的起点

接上《人生底稿》系列,本篇记录一段真实的成长碎片,不严格按时间线更新,只为记下一个农村少年,一步步走向社会的真实轨迹。 在参加某科技公司 ITMS 培训之前,我先经历了一轮面试 —— 上机题 技术面,分数…...

YOLOv8人脸检测实战:如何将WIDER Face数据集玩出新花样?结合OpenCV分类提升准确率

YOLOv8人脸检测实战:WIDER Face数据集与OpenCV分类的融合优化 人脸检测技术早已从实验室走向实际应用,但误检问题始终困扰着开发者。上周团队在商场部署的人脸统计系统,竟将广告牌上的明星照片全部计入客流——这种尴尬促使我们重新思考单阶段…...

BVH构建优化:四种分割算法在光线追踪中的性能对比

1. BVH分割算法基础概念 当你在玩3D游戏时,有没有想过为什么场景中的物体能够如此快速地渲染出来?这背后就离不开BVH(边界体积层次结构)技术的支持。简单来说,BVH就像是一个高效的"物体分类系统"&#xff0c…...