当前位置:编程学习 > C#/ASP.NET >>

C#中使用自定义消息

 

   C# WinForm编程中,你是否遇到过这样的问题,在主窗口Form1中点击按钮,弹出一个子窗口Form2,你希望在Form2中调用Form1的函数,改变Form1的显示,却发现Form1不听话,达不到预期效果。有的人说我调试了的,那段函数确实执行了,怎么还是没有显示呢?

案例:

在winform中,我在点击from1的一个按钮,弹出from3执行一个函数,其实form3就是弹出一个自制的密码输入框但是呢。然后我再from3中调用

    if (password == PassWord)

            {

                comfirm = true;

                form1.updateMac(row, col);

                this.Close();

            }

在updateMac(row,col)中我有个dataGridView1.Rows[row].Cells[col].Style.BackColor = Color.Green;但是颜色死活不变,特别奇怪,放在form1的其他函数里就能变,就是凡在这个form3调用form1的函数里,不能变色,是为什么啊

 

      其实Form1不听话是必然的,你在Form2中new Form1(),这样新新建了一个窗口对象,和本身的父窗口是两个不同的对象,你改变对象A怎么能期望对象B也变化呢?

      那有没有什么办法可以实现我们预期的效果呢?

      有的,那就是利用win32函数,使用自定义消息,做C++的人对这个应该不陌生,下面就给大家讲一下C#自定义消息。

消息发送方

一、引入命名空间

 

using System.Runtime.InteropServices; 

二、消息定义

 

//自定义的消息 

 

public const int USER = 0x500; 

 

public const int MYMESSAGE = USER + 1; 

 

三、自定义结构体

 

public  struct My_lParam 

 

       { 

 

           public int i; 

 

           public string s; 

 

       } 

 

四、重写消息发送函数

 

//消息发送API 

 

[DllImport("User32.dll", EntryPoint = "SendMessage")] 

 

private static extern int SendMessage( 

 

IntPtr hWnd,        // 信息发往的窗口的句柄 

 

int Msg,            // 消息ID 

 

int wParam,         // 参数1 

 

ref My_lParam lParam 

 

); 

 

 

五、获取窗体句柄的函数引入

 

[DllImport("User32.dll", EntryPoint = "FindWindow")] 

 

private extern static IntPtr FindWindow(string lpClassName, string lpWindowName); 

 

六、消息发送

 

IntPtr ptr = FindWindow(null, "Form1");//获取接收消息的窗体句柄,这个地方有一点我们要注意Form1必须唯一,否则windows无法将消息正确发送 

 

//消息构建 

 

My_lParam m = new My_lParam(); 

 

m.s = textBox1.Text; 

 

m.i = m.s.Length; 

 

SendMessage(ptr, MYMESSAGE, 1, ref m);//发送消息 

 

 

消息接收方

一、引入命名空间

 

using System.Runtime.InteropServices; 

 

二、消息定义

 

//自定义的消息 

 

public const int USER = 0x500; 

 

public const int MYMESSAGE = USER + 1; 

 

三、重写窗体的消息处理函数

     

 

///重写窗体的消息处理函数DefWndProc,从中加入自己定义消息 MYMESSAGE 的检测的处理入口 

 

       protected override void DefWndProc(ref Message m) 

 

       { 

 

           switch (m.Msg) 

 

           { 

 

               //接收自定义消息MYMESSAGE,并显示其参数 

 

               case MYMESSAGE: 

 

                   Form2.My_lParam ml = new Form2.My_lParam(); 

 

                   Type t = ml.GetType(); 

 

                   ml = (Form2.My_lParam)m.GetLParam(t); 

 

                   label1.Text = ml.s; 

 

                   break; 

 

               default: 

 

                   base.DefWndProc(ref m); 

 

                   break; 

 

           } 

 

       } 

 

 如上,我们就实现了一个C#自定义消息的程序,贴上一个程序下载地址:http://download.csdn.net/detail/bdstjk/2707423。

不知道大家在C#中有没有更好的实现方法。

经过研究,C#确实有方法可以更简单的实现这个功能,请看C# 委托实例(跨窗体操作控件)

 

最后再给大家介绍一种最简单的C#跨窗体操作

 

程序运行示意:

\

 

 

 


摘自 涂剑凯的专栏
补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,