lwh_122524 2023-06-07 09:57 采纳率: 60%
浏览 20

ArcGis+C#重写鼠标滚轮事件

ArcGis+C#二次开发过程中重写鼠标滚轮事件,实现地图缩放功能,但在缩小的时候会出现地图闪烁的情况不知道怎么解决

private void axMapControl_OnMouseWheel(object sender, MouseEventArgs e)
        {
            double scale = axMapControl.MapScale;
            IEnvelope mEnvelope = null;
            IPoint mPoint = new PointClass();
            //IPoint mousePoint = null;
            mEnvelope = axMapControl.ActiveView.Extent;
            mPoint.X = (mEnvelope.XMax + mEnvelope.XMin) / 2;
            mPoint.Y = (mEnvelope.YMax + mEnvelope.YMin) / 2;
            mousePoint = axMapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.X, e.Y);
            double moveDisX = mousePoint.X - (mEnvelope.XMax + mEnvelope.XMin) / 2;
            double moveDisY = mousePoint.Y - (mEnvelope.YMax + mEnvelope.YMin) / 2;
            mEnvelope.CenterAt(mousePoint);
            if (e.Delta > 0)
            {
                mEnvelope.Width = mEnvelope.Width * 0.8;
                mEnvelope.Height = mEnvelope.Height * 0.8;
                mPoint.X = mousePoint.X - moveDisX * 0.8;
                mPoint.Y = mousePoint.Y - moveDisY * 0.8;

                mEnvelope.CenterAt(mPoint);
                axMapControl.ActiveView.Extent = mEnvelope;
                axMapControl.ActiveView.Refresh();
            }
            else if (e.Delta < 0)
            {
                //if(scale>=SystemConfig.DefaultBMapScale)
                if(scale>=SystemConfig.DefaultTMapScale)
                //if (scale >= 1900000)
                {
                    mPoint.X = mousePoint.X - moveDisX;
                    mPoint.Y = mousePoint.Y - moveDisY;
                    //MapMouseUp();
                }
                else
                {
                    mEnvelope.Width = mEnvelope.Width * 1.25;
                    mEnvelope.Height = mEnvelope.Height * 1.25;
                    mPoint.X = mousePoint.X - moveDisX * 1.25;
                    mPoint.Y = mousePoint.Y - moveDisY * 1.25;

                    //mEnvelope.CenterAt(mPoint);
                    axMapControl.ActiveView.Extent = mEnvelope;
                    //axMapControl.ActiveView.Refresh();
                }
                MapMouseUp();
            }
        }

  • 写回答

3条回答 默认 最新

  • 憧憬blog 2023-06-07 14:09
    关注

    在代码中,地图闪烁的情况可能是因为在执行缩小操作时,地图的刷新不够及时,导致视觉效果出现了不连续的情况。为了解决这个问题,可以尝试对代码进行改进,如下所示:

    1. 在进行缩小操作时,先将地图的可见范围保存下来。

    2. 对地图进行缩放操作之前,调用 IMapControl2.SuppressResizeDrawing 方法,暂时禁止地图控件的绘制。

    3. 对地图进行缩放操作之后,调用 IMapControl2.Refresh 方法,手动刷新地图控件。

    以下是修改后的代码:

    private void axMapControl_OnMouseWheel(object sender, MouseEventArgs e)
    {
        double scale = axMapControl.MapScale;
        IEnvelope mEnvelope = null;
        IPoint mPoint = new PointClass();
        mEnvelope = axMapControl.ActiveView.Extent;
        mPoint.X = (mEnvelope.XMax + mEnvelope.XMin) / 2;
        mPoint.Y = (mEnvelope.YMax + mEnvelope.YMin) / 2;
        IPoint mousePoint = axMapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.X, e.Y);
        double moveDisX = mousePoint.X - (mEnvelope.XMax + mEnvelope.XMin) / 2;
        double moveDisY = mousePoint.Y - (mEnvelope.YMax + mEnvelope.YMin) / 2;
        mEnvelope.CenterAt(mousePoint);
        if (e.Delta > 0)
        {
            mEnvelope.Width = mEnvelope.Width * 0.8;
            mEnvelope.Height = mEnvelope.Height * 0.8;
            mPoint.X = mousePoint.X - moveDisX * 0.8;
            mPoint.Y = mousePoint.Y - moveDisY * 0.8;
            mEnvelope.CenterAt(mPoint);
        }
        else if (e.Delta < 0)
        {
            if(scale >= SystemConfig.DefaultTMapScale)
            {
                mPoint.X = mousePoint.X - moveDisX;
                mPoint.Y = mousePoint.Y - moveDisY;
            }
            else
            {
                mEnvelope.Width = mEnvelope.Width * 1.25;
                mEnvelope.Height = mEnvelope.Height * 1.25;
                mPoint.X = mousePoint.X - moveDisX * 1.25;
                mPoint.Y = mousePoint.Y - moveDisY * 1.25;
            }
        }
    
        // 调用 IMapControl2 接口实现缩放操作
        IMapControl2 mapControl2 = (IMapControl2)axMapControl.Object;
        mapControl2.SuppressResizeDrawing(true);  // 禁止绘制
        axMapControl.ActiveView.Extent = mEnvelope;  // 进行缩放操作
        mapControl2.SuppressResizeDrawing(false);  // 恢复绘制
        axMapControl.ActiveView.Refresh();  // 手动刷新
    }
    

    在修改后的代码中,我们使用了 IMapControl2 接口的 SuppressResizeDrawing 方法来实现暂时禁止绘制和恢复绘制的功能。在进行缩放操作时,首先调用 SuppressResizeDrawing 方法禁止绘制,然后进行缩放操作,最后再调用 Refresh 方法手动刷新地图控件。这样就可以避免在缩小操作时出现地图闪烁的情况。

    评论

报告相同问题?

问题事件

  • 创建了问题 6月7日

悬赏问题

  • ¥150 HDMI分路器LT86102 的输出在890MHz频点处EMC超标8DB
  • ¥36 如何安全的迁移用户C盘用户文件(戴尔电脑)
  • ¥15 druid(相关搜索:数据库|防火墙)
  • ¥15 大一python作业
  • ¥15 preLaunchTask"C/C++: aarch64- apple-darwin22-g++-14 生成活动 文件”已终止,退出代码为-1。
  • ¥60 如何鉴定微信小程序数据被篡改过
  • ¥18 关于#贝叶斯概率#的问题:这篇文章中利用em算法求出了对数似然值作为概率表参数,然后进行概率表计算,这个概率表是怎样计算的呀
  • ¥20 C#上传XML格式数据
  • ¥15 elementui上传结合oss接口断点续传,现在只差停止上传和继续上传,各大精英看下
  • ¥20 手机截图相片分辨率降低一半