我已经在 ESRI 支持论坛上发布了这个,但目前还没有人回来提供解决方案。
背景:我正在维护一个使用 ESRI ArcGIS 组件(版本 9.3.1 SP1)的 C++ 地图显示应用程序。它实例化一个 Map 对象(esriCarto::Map),查询 IActiveView 接口,并调用 Activate 以传入视图窗口客户区(还有一大堆其他属性也通过各种接口设置)。然后在一系列绘图操作的中间使用它来渲染最终的显示图像。
问题: WM_MOUSEWHEEL 事件似乎在 Map 对象(或子对象?)中被拾取,并导致奇怪的行为。应用程序中应该发生的是视图窗口收到此消息,然后调用“缩放”方法来触发适当的重绘。实际发生的是消息通过视图窗口的 PreTranslateMessage,然后显示区域出现故障,然后调用视图窗口的 OnMouseWheel 处理程序来处理缩放。
“故障”是指视图窗口短暂变白,然后重新显示上一个图像。这在与 ArcGIS 9.2 集成的应用程序的早期版本中没有发生,并且在发生这种故障效果时,没有调用应用程序自己的绘图代码。如果通过替代上下文菜单选项调用窗口的缩放功能,也不会发生这种情况。
在阅读了参考信息一段时间后,我怀疑 Map 的子 ScreenDisplay 对象正在响应鼠标滚轮事件并在执行我们不希望它对视图区域执行的操作 - 我还怀疑有一种方法可以告诉它不是,但我似乎找不到它。我确实有一个解决方法,即处理视图窗口的 PreTranslateMessage 中的缩放,并防止消息进一步传播,但这感觉有点像 hack。
那么,任何善良和聪明的人都可以告诉我一种告诉 Map 对象忽略鼠标滚轮事件的方法吗?