■〓纯自绘界面的问题〓■

kalala2kalala 2011-02-25 09:37:47
Windows 是基于消息的,当有事件发生时,Windows 就把消息发送到相应的程序。

这里讨论界面与鼠标消息的问题。

Windows 提供了许多内建的控件 (Edit box, Combo box 等等,控件都是子窗口),实际上所有控件都是画出来的,所有的控件在屏幕上占据一块区域(实际由内部结构定义),当鼠标在屏幕上移动时,系统通过查找鼠标光标位于哪个区域上,然后把消息发到对应的窗口相关联的窗口过程(以回调的方式),我在这部分的理解上有一些不明确的地方,就是,如果屏幕上有数百上千个窗口(或控件),那是不是每移动一下鼠标,它都要遍历一遍所有的这些窗口,看鼠标光标到底落在哪个窗口上?这样的开销是不是太大了?Windows 在内部到底是怎么做的?

如果我要实现完全自绘的界面,除了主窗口外,其他所有的界面元素都是自绘的(即不使用 Windows 提供的任何控件),应该是类似于 DirectUI 这种方式吧,我怎么检测鼠标光标落在我的哪个自绘界面元素上呢?除了把所有自绘界面元素遍历一遍进行对比的方法外有没有其他方法呢?没理由每移动一下鼠标都要遍历一遍吧?我总觉得这是一种很笨且效率低下的办法。

在这个问题上能不能使用哈希算法解决?

大家讨论一下
...全文
176 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ww884203 2011-02-25
  • 打赏
  • 举报
回复
原来如此啊,学习的时候还没想到这些问题呢,呵呵,学习了
xwfde 2011-02-25
  • 打赏
  • 举报
回复
当然找到后肯定就break 了,没必要再遍历后面的。二楼经历丰富。
xwfde 2011-02-25
  • 打赏
  • 举报
回复
是要遍历一遍。遍历数目在几十万个级别上时遍历一遍时间是很短的,但你不会有那么多窗口。事实上windows对句柄个数做了限制(单进程约一万两千个,系统共约一万六千个),如果句柄数目超出那个数目windows将停止对程序提供服务分配更多的句柄。一个程序的窗口数目应该在一百个以内,或者稍多,遍历一遍消耗的是cpu 资源。可以做个测试,打开一个程序,最好是菜单和按钮数目多一点的,打开任务管理器,鼠标快速在菜单和按钮间滑动,看看程序cpu 使用率上升了多少。应该同数目多少成正比的。
关于windows 程序设计可以和我讨论QQ76149287
Jinhao 2011-02-25
  • 打赏
  • 举报
回复
不需要遍历所有.从最底层的窗口开始遍历,找到了之后,就只遍历该窗口中的子窗口.依次这样.
xwfde 2011-02-25
  • 打赏
  • 举报
回复
这个楼主很懒结帖率零…
打开链接下载源码: https://pan.quark.cn/s/c43e5bd27521 标题中的“AMD and Nvidia GOP update 1.9.6.rar”表示这是一个包含了AMD与Nvidia显卡的GOP(Graphics Output Protocol)驱动程序升级至1.9.6版本的压缩文件。该更新主要针对显卡在UEFI(统一可扩展固件接口)环境下的图形输出性能进行优化,并致力于提升系统的稳定性。在描述中提及“显卡附加UEFI引导工具,最新版”,表明此次更新内含了一个专为UEFI BIOS环境设计的显卡引导工具,或许表现为一个自启动脚本或程序,例如GOPupd.bat。通过这一工具,用户能够在UEFI模式下对显卡进行精确的配置和初始化,从而保障操作系统能够最大化地发挥显卡的效能。必需的组件包括“colorama-0.4.3”,这是一个在Windows平台上用于管理颜色控制序列的Python模块,可能在更新过程中用于生成彩色命令行显示,以增强用户交互的直观性。此外,“Visual C++Redistributable”是微软提供的运行时支持库,旨在确保基于C++编译的应用程序能够正常运行,此处可能用于更新工具或相关依赖模块。标签“uefi bios”突显了该更新与UEFI BIOS系统的紧密关联,暗示其将作用于计算机的启动序列及硬件初始化过程。压缩包内的文件清单如下: 1. GOPupd.bat - 很有可能是负责执行GPU UEFI引导更新的核心脚本。 2. #Nvidia_ROM_Info.bat 和 #AMD_ROM_Info.bat - 这两个文档可能用于采集Nvidia与AMD显卡的ROM数据,以辅助识别显卡型号并执行适配性验证。 3....
代码下载地址: https://pan.quark.cn/s/a2e2c95e6128 意法半导体(STMicroelectronics)研发的STM32H750是一款性能优越的微控制器,属于STM32H7系列,拥有卓越的处理性能以及多元化的外设接口。在此项工作中,我们将研究如何借助STM32H750达成串口空闲中断(IDLE interrupt)的运用、借助DMA完成UART(通用异步收发传输器)的数据传输,并且探究如何运用STM32CubeMX配置并构建MDK5(Keil uVision5)项目。串口空闲中断是串口通信中的一个核心功能,当串口在一段时间内没有进行数据交换时,会引发该中断。这种功能在需要实时监测串口状态的应用场合中非常有价值,比如,在等待特定指令或需要降低能耗的情况下。在STM32H750中,设定串口空闲中断通常包含以下几个环节: 1. 串口设置:在STM32CubeMX中选定相应的UART接口,并激活中断功能。 2. 中断优先级设定:按照应用需求设定中断优先级。 3. 中断服务函数注册:在程序代码中定义中断服务函数以应对中断事件。 4. 启用串口空闲中断:在初始化代码中激活串口的IDLE位,使能中断。 DMA(Direct Memory Access)传输是一种高效的数据传输机制,它允许外设直接与内存进行交互,无需CPU的介入,从而减轻了CPU的工作负担。在STM32H750中,我们可以运用DMA配合UART来接收数据: 1. DMA配置:在STM32CubeMX中为UART选择合适的DMA通道,并设定传输特性。 2. UART配置:将UART设置为DMA模式,并指定接收缓冲区的地址。 3. 中断配置:开启DMA传输完成中断,以便在数据接收完...

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧