skyline中屏蔽或自定义InformationWindow和NavigationMap的右键菜单

在skyline中,官方指提供了能屏蔽3DWindow的鼠标事件,而InformationWindow和NavigationMap是不能屏蔽的,但在实际项目中有屏蔽或自定义其右键菜单的必要

1.屏蔽

我们的系统使用了Weifenluo控件作为实现MDI窗口,InformationWindow和NavigationMap分别放在两个DockContent(DockContent继承Form)里面,且都是占满整个控件

Form类这样写

    public partial class InformationDocument : DockContent, IMessageFilter

    {

        public InformationDocument()

        {

            InitializeComponent();



            Application.AddMessageFilter(this);

        }

        

        public bool PreFilterMessage(ref   Message m)

        {

            const int WM_RBUTTONDBLCLK = 0x206;

            const int WM_RBUTTONDOWN = 0x204;

            const int WM_RBUTTONUP = 0x205;



            switch (m.Msg)

            {

                //过滤掉所有与右键有关的消息 

                case WM_RBUTTONDBLCLK:

                case WM_RBUTTONDOWN:

                case WM_RBUTTONUP:

                    if (this.IsActivated == true)

                    {

                        return true;

                    }

                    else

                    {

                        return false;

                    }

                default:

                    return false;

            }

        }

 

其中继承了IMessageFilter接口,这个接口实现过滤消息

PreFilterMessage方法是过滤的具体实现,由于IMessageFilter会影响整个应用程序(注意!!),因此我们还要判断当前操作的是否本form,在这里有属性IsActivated能判断

2.自定义右键菜单

以上是屏蔽,自定义菜单的话就稍微做点修改,把PreFilterMessage方法改成这样

        public bool PreFilterMessage(ref   Message m)

        {

            const int WM_RBUTTONDBLCLK = 0x206;

            const int WM_RBUTTONDOWN = 0x204;

            const int WM_RBUTTONUP = 0x205;



            switch (m.Msg)

            {

                //过滤掉所有与右键有关的消息 

                case WM_RBUTTONDBLCLK:

                case WM_RBUTTONDOWN:

                case WM_RBUTTONUP:

                    if (this.IsActivated == true)

                    {

                        m.HWnd = new IntPtr(0x202);

                        contextMenuStrip1.Show(Cursor.Position.X, Cursor.Position.Y);



                        return false;

                    }

                    else

                    {

                        return false;

                    }

                default:

                    return false;

            }

        }

 m.HWnd = new IntPtr(0x202);这句是把消息改为鼠标左键点击,这是为了能选中项

contextMenuStrip1.Show(Cursor.Position.X, Cursor.Position.Y);这句是弹出一个自定义的右键菜单

 

PS:关于这种过滤鼠标事件,本来想用另一种方法,重写WndProc方法,但不知为什么捕捉不到右键点击消息(.net自带控件是可以的)

你可能感兴趣的:(window)