zoukankan      html  css  js  c++  java
  • 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自带控件是可以的)

  • 相关阅读:
    动态库学习 第1章——演练:创建和使用动态链接库 (C++)
    MSDN学习DirectShow——第二章 入门指南
    MSDN学习DirectShow——第一章 DirectShow介绍
    《大话设计模式》读书笔记(C++代码实现) 第二章:策略模式
    MSDN学习DirectShow——第三章 关于DirectShow
    MSDN学习DirectShow——第0章 前言
    一个体育生的编程之路(二)
    Request应用
    Servlet
    实现Runnable接口(推荐使用)
  • 原文地址:https://www.cnblogs.com/cannel/p/2589695.html
Copyright © 2011-2022 走看看