我按下鼠标,Windows是如何知道我点击了哪个窗口的?

srmonkey 2008-05-15 05:00:39
我们桌面上这么多窗体,鼠标随便点击一下,Windows就会给点击到的窗体发送一个鼠标消息。
现在老板要我模拟这种思想,做一张中国地图,鼠标移到哪个省,哪个省就会高亮显示,点击后就进入这个省,要知道这些省都是不规则显示的图型。

我左思右想,不知道Windows内核算法是如何的,而且判断速度这么快。如果它每个窗口都检测,会很占资源吧?肯定有什么类似消息映射一样的机制。

请高手回答,谢谢!
...全文
514 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
vocanicy 2008-05-20
  • 打赏
  • 举报
回复
更简单的方法就是类似HITTEST

你可以保存一个整个中国的位图,每个省份用不同的颜色(ID)
例如,广东1;福建2;

你只需取出点中位置的颜色,就知道你点中的是哪个省,就不需要遍历每个省去匹配,那样效率太低了。
virtualfunction 2008-05-20
  • 打赏
  • 举报
回复
高亮显示 思路:鼠标在Region上移动有3种状态,如下:
1、进入Region:高亮绘图;
2、在Region内移动:不绘图;
3、离开Region:低亮绘图;
virtualfunction 2008-05-20
  • 打赏
  • 举报
回复
windows是用叫做Region的东东来判别的,不规则窗口也是用它做的!!!

1、用包围省份的多边形顶点数组创建一个Region;
HRGN CreatePolygonRgn(
CONST POINT *lppt, // array of points <---包围省份的多边形顶点数组
int cPoints, // number of points in array
int fnPolyFillMode // polygon-filling mode
);

2、调用下列函数判断一个点是否落在Region内:
BOOL PtInRegion(
HRGN hrgn, // handle to region
int X, // x-coordinate of point
int Y // y-coordinate of point
);

3、完了!
食人族哲学家 2008-05-19
  • 打赏
  • 举报
回复
都什么啊,有那么复杂吗,是我想简单了还是大家想复杂了呢?
把所有省的地图都做成不规则窗口,响应mousemove改变亮度(好象有个acti什么状态的大概也行),然后在响应点击不就都ok了吗?(也可以做成不规则按钮)
至于你说windows是怎么干的,为什么那么高效我也不清楚,进来就是想看看有没有高手对这个发表高见。
Pause_break 2008-05-16
  • 打赏
  • 举报
回复
你的地图是矢量图吗?矢量图可以建每个省的最小外包矩形,查询时第一步先过滤掉一些省,剩下的省份做为候选集,然后判定一个点是不是在一个省的边界范围内,一个点是否在不规则多边形内部可以参考图形学里面的多边形填充算法。
引力场变动源 2008-05-15
  • 打赏
  • 举报
回复
我上面说的那个方法其实是3D图形学里面“渲染到纹理拾取”的一个变形,WIndows应该不是那样检测的。

楼上说的格网索引对于大地图来说应该是非常有效的,但是如果是小地图的话,比如1024×1024或者更小分辨率的地图来说,我提供的方法几乎不需要额外的运算量的,也能精确到像素,但是如果是大地图的话,即使使用byte类型的数组,对内存的占用也会很惊人。
genius_hb 2008-05-15
  • 打赏
  • 举报
回复
就没一个搞GIS的...看来这行业前途堪忧
这是典型的空间索引要解决的问题..

你这个情况,图上的每个省相互不重叠的.
就用普通的格网索引就行,格网不需要太精细,就能提高很多的速度
或者用四叉树,R树都行...

具体的细节 google ,我就是来混分的,哈哈
srmonkey 2008-05-15
  • 打赏
  • 举报
回复
所以我想知道Windows,linux这些操作系统是怎么做不规则窗体的命中测试的
lake_cx 2008-05-15
  • 打赏
  • 举报
回复
是我想简单了,对于楼主的窗体需要使用闭合路径来标识区域,而不是Rect,我不太清楚判断一个点在闭合路径的内部的速度有多快,但是强烈建议楼主,不要试图用不规则窗体来构造个省的图形对象,那样性能肯定大打折扣。
直接用GDI绘图,并使用自己的结构存储及位置判断。
lake_cx 2008-05-15
  • 打赏
  • 举报
回复
其实以我的想法,Windows判断窗体很简单的,直接遍历屏幕上的窗体就行了
窗体是可能很多,但是真正在屏幕上显示的窗体并不是那么多,维护一个显示的列表就行了(GDI绘图肯定要维护的)
假设屏幕上全是10*10的窗体,1024*768大约有800个窗体,判断区域800次还是很快的吧,何况肯定不会有这么多

所以针对你那中国地图的省,我觉得你完全不用考虑遍历带来的性能影响。
当然你一定要考虑,你就构建树结构吧,譬如
1 北方(Rect=...)
1.1东北(Rect=...)
1.1.1黑龙江(Rect=...)
1.1.2吉林(Rect=...)
1.2华北(Rect=...)
...
2 南方(Rect=...)
然后按层次判断区域,这样可以优化带来的遍历影响,但是给维护带来了不便。。。
icosagon 2008-05-15
  • 打赏
  • 举报
回复
windows不是这样做的,涉及到硬件中断,具体我不是很清楚,你的问题不需要了解这么深的了解吧,只需要理解windows消息机制就行了。
srmonkey 2008-05-15
  • 打赏
  • 举报
回复
Silenker ,谢谢你的回答
这个方法我昨天睡觉的时候想到一下,我还是有两点疑问:
一、Windows是不是这样做的?它是不是已经把显示器上每个点都做一个二维数组保存着,再使每个点都对应着一个窗体句柄?如果是这样,用户经常切换窗体,会不会使这种方法效率低下?
二、矩形倒是比较容易实现这样的算法,只要RECT的坐标范围即可,但是Windows中不规则窗体的命中检测速度也相当快,那是不是要用到微积分?因为地图全是不规则区域,如果要用到微积分就复杂了
引力场变动源 2008-05-15
  • 打赏
  • 举报
回复
一个高效并且绝对精确的方法是,在后台建立一个与显示的地图一样大小的图像或者二维数组,然后把每个省的编号作为颜色填充对应的区域。
鼠标移动和点击的时候,只要把鼠标的(x,y)值作为下标去查询那个后台的数组,得到的值就是对应省的编号,就知道是哪个省了^^

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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