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

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

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

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

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

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

大家讨论一下
...全文
122 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
这个楼主很懒结帖率零…

65,187

社区成员

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

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