窗体之间的消息通信

这段时间在做一个winform的项目,一直有一个两个窗体之间的消息传递的问题困扰着我。我们是使用一个winform里面放了一个tabcontrol控件,然后在这个控件里面分别放tabdev和tabDB这两个窗体,前者主要负责操作,后者负责数据管理。

窗体之间的消息通信_第1张图片


窗体之间的消息通信_第2张图片

我希望通过点击数据管理界面,点击显示按钮,就可以让我的数据显示在数据操作界面。一开始我想用窗体之间的传值,但是我的tabdev和tabDB是在mainform里面初始化的,而mainform和另外两个窗体并不在同一个命名空间中。

本来我一直思考如何通过点击数据管理界面的显示按钮来触发数据操作页面的事件,尝试用了委托什么的,但是我没搞很懂,后来也没弄成。后来我终于恍然大悟,因为我的两个窗体都是在mainform里面初始化的,所以mainform可以作为这个中介者来进行两个窗体之间的消息的传递。

消息传递

这里面的消息传递我用的是进程通信,具体原理我也不是特别懂,我就贴上代码了,在tabDB里面
 public struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int cbData;
            [MarshalAs(UnmanagedType.LPTStr)]
            public string lpData;
        }

        #region 消息通信
        public const int USER = 0x500;
        public const int MYMESSAGE = USER + 1;
        [DllImport("User32.dll", EntryPoint = "SendMessage")]
        private static extern int SendMessage(
        IntPtr hWnd, // handle to destination window 
        uint Msg, // message 
        uint wParam, // first message parameter 
        //uint lParam // second message parameter 
        ref COPYDATASTRUCT lParam
        );
        //申明DLL中启动消息函数 
        [DllImport("MessageDLL.dll", EntryPoint = "StartSendMessage")]
        private extern static void StartSendMessage(IntPtr hWnd); 
        #endregion

在mainform里面
        public struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int cbData;
            [MarshalAs(UnmanagedType.LPTStr)]
            public string lpData;
        }
     public const int USER = 0x500;
        public const int MYMESSAGE = USER + 1;
        protected override void DefWndProc(ref System.Windows.Forms.Message m)
        {
            switch (m.Msg)
            {
                case MYMESSAGE://处理消息 
                    COPYDATASTRUCT cds = new COPYDATASTRUCT();
                    Type t = cds.GetType();
                    cds = (COPYDATASTRUCT)m.GetLParam(t);
                    message = cds.lpData;
                    openSpec(message);
                    break;
                default:
                    base.DefWndProc(ref m);//调用基类函数处理非自定义消息。 
                    break;
            }
        }

这样最终就解决了我的问题!

你可能感兴趣的:(winform开发)