`
weizhai12
  • 浏览: 149427 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

C#中在窗体间使用消息来处理相关联的事件

 
阅读更多

在项目中有这样的需求,在主窗体隐藏时或者主进程运行时对其它窗体的控件或者事件进行控制,而且其它窗体是处于活动状态,而主窗体或者主进程是隐藏在后面的。这个时候使用句柄和消息来处理就比较好解决这些问题了,当然了也可以使用其它方法。比如将其它窗体在主窗体中申明并且定义,使之和主窗体一样一直存在于内存中,在各个窗体中申明公共方法,在主进程需要调用时直接调用即可,但是这样耗费了大量的系统资源。现在使用消息来解决这个问题。下面提供一个小程序,在主窗体中通过句柄和消息来控制子窗体中Label上文字变化和颜色,代码如下:


Windowns的API类

usingSystem;
usingSystem.Runtime.InteropServices;

namespaceTestHwnd
{
publicclassWin32API
{
[DllImport("user32.dll ",CharSet = CharSet.Unicode)]
publicstaticexternIntPtrPostMessage(IntPtr hwnd,intwMsg,stringwParam,stringlParam);

}

}


主窗体程序(发送消息):

usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Runtime.InteropServices;

namespaceTestHwnd
{
publicpartialclassMain : Form
{

//定义了一个子窗体的句柄
publicIntPtr hwndfrmTest;


publicMain()
{
InitializeComponent();
}



privatevoidtimer1_Tick(objectsender,EventArgs e)
{

if(hwndfrmTest!=(IntPtr)0)
{
if(DateTime.Now.Second%3==0)
{
Win32API.PostMessage(hwndfrmTest,0x60,"","");
}

if(DateTime.Now.Second%5==0)
{
Win32API.PostMessage(hwndfrmTest,0x61,"","");
}

}

}


voidButton2Click(objectsender,EventArgs e)
{
frmTest frm=newfrmTest();
frm.Show(this);
}
}

子窗体程序(接收消息)

usingSystem;
usingSystem.Drawing;
usingSystem.Windows.Forms;

namespaceTestHwnd
{
///<summary>
///Description of frmTest.
///</summary>
publicpartialclassfrmTest : Form
{
Main main;
publicfrmTest()
{
//
// The InitializeComponent() call is required for Windows Forms designer support.
//
InitializeComponent();

//
//TODO: Add constructor code after the InitializeComponent() call.
//
}

voidFrmTest_Load(objectsender,EventArgs e)
{

main =this.OwnerasMain;

//初始化该窗体的句柄

main.hwndfrmTest =this.Handle;
}

///重写窗体的消息处理函数DefWndProc,从中加入自己定义消息 MYMESSAGE 的检测的处理入口
protectedoverridevoidDefWndProc(refMessage m)
{
switch(m.Msg)
{
case0x60:
{
label1.ForeColor=Color.Red;
label1.Text = DateTime.Now.ToString()+"-"+"测试成功。。。。,呵呵,变红了";
}
break;
case0x61:
{
label1.ForeColor=Color.Blue;
label1.Text = DateTime.Now.ToString()+"-"+"测试成功。。。。,呵呵,变蓝了";
}
break;
default:
base.DefWndProc(refm);
break;
}
}



voidButton1Click(objectsender,EventArgs e)
{
main.hwndfrmTest =(IntPtr)(0);
this.Close();
}
}
}













}

分享到:
评论

相关推荐

    反编译C#项目得到源代码,恢复窗体的.cs和.resx文件间的关联.zip

    在C#项目中,这些文件通常由Visual Studio自动管理,生成对应的.cs文件来处理资源的逻辑。 "2恢复窗体的.cs和.resx文件间的关联,大致有两步"这部分内容可能是指如何手动恢复两者之间的关系,通常涉及以下步骤: 1...

    C#跨窗体更新-委托实例

    - 创建事件:在发送窗体中,定义一个事件,使用之前定义的委托作为事件处理程序的类型。 - 触发事件:当需要发送消息时,触发这个事件,传入所需的数据。 - 注册事件:在接收窗体中,注册发送窗体的事件,提供一...

    C#漂亮窗体界面,树视图,列表视图等控件

    在本案例中,"树视图节点信息保存在项目文件夹下"意味着每个节点可能与特定的文件或配置项相关联,这样可以通过读取和写入文件来加载和保存节点状态。 "列表视图(ListView)"是另一种常用的控件,它允许显示多列...

    学生管理系统数据库 窗体 程序C#

    4. **事件驱动编程**:C#窗体中的按钮、文本框等控件都可触发事件,如Click事件。开发者需编写事件处理函数,当用户点击按钮时执行相应的操作,如保存新学生信息、删除选定学生等。 5. **数据绑定**:在窗体设计中...

    C#QQ的漂亮窗体简单易懂

    在C#中,我们可以使用Windows Forms或WPF(Windows Presentation Foundation)来创建窗体。对于QQ风格的窗体,可能需要自定义控件、调整布局和颜色方案,以模仿QQ的视觉样式。 2. **自定义控件**:QQ界面中的某些...

    C#设置子窗体在主窗体中居中显示解决方案

    在C#编程中,创建应用程序时,经常需要子窗体在主窗体中居中显示,以提供良好的用户界面体验。然而,实现这一功能并不总是直观的,有时开发者可能会遇到一些陷阱。本篇文章将深入探讨如何正确地设置C#中的子窗体在主...

    实现弹出窗体的对一些信息的现实即是tips窗体

    2. **消息机制**:窗体的显示和关闭往往与系统消息相关联。开发者需要监听特定的消息,比如鼠标点击、键盘事件或者自定义的消息,然后根据这些消息触发窗体的显示或隐藏。 3. **内容展示**:提示窗体上的信息可以...

    C# WinForm窗体控件Panel修改边框颜色以及边框宽度方法

    在C# WinForm开发中,Panel控件是一个非常常用的组件,它可以用来组织其他控件或者作为容器使用。本文将深入探讨如何修改Panel控件的边框颜色和边框宽度,以实现自定义的视觉效果。 首先,我们需要了解Panel控件的...

    C#个人相册管理

    例如,使用字典或关联列表来关联照片和评论,或者通过树形结构来组织标签。 最后,考虑到软件的可维护性和版本控制,良好的代码组织和版本控制系统(如Git)的使用是必不可少的。每个功能模块应遵循单一职责原则,...

    C#窗体控件

    本节详细介绍了C#窗体中常见的属性及其作用,帮助开发者更好地理解和应用这些属性。 1. **Name属性** - **功能**:设置或获取窗体的名称。 - **用途**:通过Name属性可以在代码中唯一标识一个窗体,便于后续操作...

    C#多线程调用Winform窗体[文].pdf

    Winform窗体是基于Windows消息机制的,每个窗体实例都与一个特定的线程相关联,这个线程负责处理窗口的消息循环。这意味着,窗体的事件处理方法必须在创建它的线程中运行,以确保线程安全和正确的行为。 Control类...

    C# 可缩放带刻度坐标绘制

    在事件处理函数中,重新计算坐标系相对于窗体的比例,并基于这个比例调整坐标轴和刻度的位置。 - 使用`Control.Scale()`方法可以方便地缩放控件及其子控件。例如,`panel1.Scale(new SizeF(scaleFactor, scale...

    c# net 外国异形窗体实现-ekxw.rar

    在C# .NET编程环境中,实现...总之,实现C# .NET中的外国异形窗体涉及到Windows API的使用、自定义控件的创建、图形路径的绘制以及窗体事件的处理。通过这些步骤,开发者可以创造出独特而引人注目的应用程序界面。

    实现控件随窗体变化而变化

    C#窗体类有一个`Resize`事件,当窗体大小改变时会被触发。你可以为窗体添加一个事件处理程序,通过代码动态调整控件的大小。例如,对于图片控件,可以更新其`Size`属性以保持与窗体的相对比例: ```csharp ...

    C# 自定义边框 最大化最小化按钮

    标题“C# 自定义边框 最大化最小化按钮”指的是如何在C#窗体应用中,不使用默认的系统边框样式,而是创建自定义的边框,并实现窗口的最大化和最小化功能,同时包含窗体边缘拖动以改变大小的功能。这一过程涉及到...

    halcon 与C#之HWindow鼠标控制图片缩放,拖动,roi 源码

    在本文中,我们将深入探讨如何使用Halcon库与C#结合,实现在HWindow中对图像进行鼠标控制的缩放、拖动以及ROI(Region of Interest)操作。这对于图像处理和机器视觉应用来说是非常关键的功能,它能帮助我们更有效地...

    C# 使用进度条 教你怎么用进度条

    在`worker_ProgressChanged`事件处理程序中更新进度条: ```csharp private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage; } ``` 最后...

    qq简易窗体应用程序

    在Windows编程领域,VS窗体应用通常指的是使用C#、VB.NET等.NET Framework语言开发的Windows Forms应用。 1. **Visual Studio**:Microsoft的集成开发环境(IDE),支持多种编程语言,包括C#、VB.NET等。它提供了...

    C#应用程序开发-Windows布局与事件.pptx

    在C#应用程序开发中,...总结来说,C#应用程序开发中的Windows布局与事件涉及窗体创建、控件添加、布局管理以及事件处理等多个方面。通过理解和熟练运用这些概念,开发者能够创建出用户友好且响应迅速的桌面应用程序。

    C#获取鼠标坐标源码

    在WPF中,处理方式略有不同,因为WPF使用MVVM(Model-View-ViewModel)架构,事件处理通常与视图模型关联。以下是一个WPF的`MouseMove`事件处理示例: ```xml &lt;!-- XAML部分 --&gt; xmlns=...

Global site tag (gtag.js) - Google Analytics