C#窗体之间传递消息和事件
来源:互联网 发布:unity3d 显示3d模型 编辑:程序博客网 时间:2024/05/16 03:48
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#跨窗体操作
程序运行示意:
现在给大家介绍一种最简单的跨窗体操作
WinForm的窗体是一个类,C#的类是引用类型,那么我们应该可以将WinForm窗体类进行传递,那不就可以进行操作了么?
效果描述:
有三个窗体然后顺序分别是
(1)点击第一个窗体中的按钮弹出第二个窗体,隐藏第一个窗体
(2)第二个窗体到一定时间弹出第三个窗体
(3)点击第三个窗体的按钮关闭第三个和第二个窗体,弹出第一个窗体
From1
- using System;
- using System.Windows.Forms;
- namespace WindowsFormsApplication1
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- private void 打开form2隐藏form1_Click(object sender, EventArgs e)
- {
- Form2 f = new Form2();
- f.fatherForm = this;
- f.Show();
- this.Hide();
- }
- }
- }
Form2
- using System;
- using System.Windows.Forms;
- namespace WindowsFormsApplication1
- {
- public partial class Form2 : Form
- {
- public Form2()
- {
- InitializeComponent();
- }
- public Form1 fatherForm;
- private void 打开from3_Click(object sender, EventArgs e)
- {
- Form3 f = new Form3();
- f.fatherForm = this;
- f.Show();
- }
- }
- }
Form3
- using System;
- using System.Windows.Forms;
- namespace WindowsFormsApplication1
- {
- public partial class Form3 : Form
- {
- public Form3()
- {
- InitializeComponent();
- }
- public Form2 fatherForm;
- private void 关闭form3from2显示from1_Click(object sender, EventArgs e)
- {
- fatherForm.fatherForm.Show();
- fatherForm.Close();
- this.Close();
- }
- }
- }
- C#窗体之间传递消息和事件
- 使用事件和委托再两个窗体之间传递数据
- C#窗体之间传递数据
- C#窗体之间传递参数
- C# 窗体之间值传递
- C#中窗体间的消息传递
- C#中窗体之间的数据传递
- C#中窗体之间的数据传递
- C#不同窗体之间的数据传递
- C# WinForm(窗体) 之间传递变量
- 窗体之间传递事件,小窗体更新datagridview
- C# WinForm 两个窗体之间发送消息
- MFC 线程的消息传递问题一---线程和窗体之间
- 03_Qt的事件传递、消息过滤器和消息通知(类与类之间通讯)
- C# 窗体和消息处理
- MFC在不同的类窗体之间传递消息
- C#对象间的协作和信息交换(二)主窗体向从窗体传递消息
- C#对象间的协作和信息交换(三)从窗体向主窗体传递消息
- 什么是PERT网络分析?
- js 压缩
- MVC中V与C之间的通话
- ceph存储 用命令行方式关闭CentOS防火墙
- 第十五周 OJ平台-指针当形参
- C#窗体之间传递消息和事件
- OJ玩指针
- C语言流程控制续
- 项目成本的几种估算方法
- linux 下的 wchar_t
- 数数(南阳oj198)
- Dynamic pull and push in 0.9.19
- 第十五周 OJ平台-指针的基本操作(2)
- 第十五周项目3在OJ上玩指针