C#中使用自定义消息
来源:互联网 发布:读取js代码自动换行 编辑:程序博客网 时间:2024/05/17 01:07
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#中使用自定义消息
- C#中使用自定义消息
- C#中使用自定义消息
- 在C#中使用自定义消息
- 在C#中使用自定义消息
- 在C#中使用自定义消息
- 在C#中使用自定义消息
- MFC中使用自定义消息
- MFC中使用自定义消息
- MFC中自定义消息使用
- MFC 中使用自定义消息
- MFC中使用自定义消息
- MFC中使用自定义消息
- MFC中使用自定义消息 .
- C#中自定义消息,与MFc对比
- C# 中自定义消息的实现
- C#中自定义消息传送数组
- VC中如何使用自定义消息?
- C# 关于 ini 配置文件的操作
- 通过路由器绕过DDoS防御攻击web服务器总结
- 网上银行安全证书工作原理
- 简单的javaBean实现访问量统计
- 货比三家——Chrome 购物比价插件推荐
- C#中使用自定义消息
- listview中放Button 点击 长按事件
- SEO的那些事儿
- DIV滚动条属性及样式设置方式
- 关于JAVA的路径
- wordpress中的模板标签
- 迎接2012之JavaScript所谓的“重载”
- Android 近百个项目的源代码,覆盖Android开发的每个领域
- OpenMP中数据属性相关子句详解(3): reduction子句