地图热点问题,高分求救!

yfd 2002-12-23 11:34:53
我这个问题的应用背景是:

有一个小系统要求有地图导航功能,这样,屏幕上的地图必须要能支持“热点”,即鼠标移动到地图上的某个区域时(OnMouseMove事件),系统要将这个区域变成另外一种颜色,表示这个区域被选中。

我用TImage显示地图,并尝试了下面几种方法实现地图“热点”:

方法一:
鼠标移动到地图上一定区域的时候,将屏幕上和鼠标所在点的颜色相同的点的颜色改成被选中的颜色(通过操作Image->Canvas->Pixels[][]来实现),由于我事先对地图做了特殊处理,使不同区域的颜色各不相同,所以这种方法可以实现地图“热点”,但是对屏幕上所有的点逐一检查并设置颜色的操作非常慢,而事件又非常频繁,所以这种方法速度太慢,无法使用。

方法二:
由于地图上的热点不多(20个左右),我预先将地图上所有可能出现的热点的情况生成了20多个静态图片(所以程序启动时比较慢),然后在OnMouseMove事件时用Image->Canvas->CopyRect方法将生成的静态图片拷贝到屏幕上来,用这个办法速度提高了不少,但是还是不够满意。

方法三:
方法三和方法二差不多,也预先生成了静态图片,关键是在OnMouseMove事件时,用
OldImage->Visible=0;
NewImage->Visible=1;
的方法实现图片切换,这样图片切换的速度大大加快了,速度不成问题了,但是切换图片的时候屏幕会闪烁。

请问:
有没有什么更好的办法?
怎么防止屏幕闪烁?
...全文
69 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljianq 2002-12-24
  • 打赏
  • 举报
回复
TMS控件中有你要的。
fsstolw 2002-12-24
  • 打赏
  • 举报
回复
还有一个方法:做一个类似"放大镜"功能,但不用放大图像,只是把该区域的图片放在"放大镜"里面重新显示出来,这样就能能按你的想法随意处理了。我用DEPHI做了这个功能,显示医学图像,效果和速度都非常不错的。
weibz0525 2002-12-24
  • 打赏
  • 举报
回复
1没有必要进行全图的检测,在 Image的OnMouseMove事件里,判断X,Y所在的范围就行了。X,Y 的坐标就是当前鼠标在客户区的坐标,也就是你那幅图上的坐标。知道每个地图的四个角的坐标,用if...elseif..elseif就可以了。不知道的话判断Image1->Canvas->Pixels[x][y]=颜色。应该也可以,试试 吧
2不太明白,为什么用copyrect,原来图上没有吗?
3Image是不是在form上,是的话在form的OnCreate事件里添加DoubleBuffered=true;不是的话代码写为
Image上一级控件->DoubleBuffered=true;肯定能解决闪烁。
yfd 2002-12-24
  • 打赏
  • 举报
回复
设置了DoubleBuffered=1之后成功了

谢谢weibz0525(小虫)

谢谢各位参予!

过个快乐的平安夜!

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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