C#开发WINDOWS应用程序时消息的处理

2016-02-19 12:09 44 1 收藏

下面是个简单易学的C#开发WINDOWS应用程序时消息的处理教程,图老师小编详细图解介绍包你轻松学会,喜欢的朋友赶紧get起来吧!

【 tulaoshi.com - 编程语言 】

WINDOWS应用程序是靠消息驱动的,在VC中我们通过CLASSWIZARD可以为某窗口类添加消息处理函数,CLASSWIZARD将为你添加消息映射,对于WINDOWS消息,生成的消息处理函数重载了基类的虚拟方法。而在C#中如何处理消息呢?本文针对VS.NET BETA1环境下的C#简单地介绍WINDOWS消息以及自定义消息的处理方法。

示例代码下载 17K

一、生成一个名为MSGApplication的工程
工程的建立方法请参考:C#学习笔记之一

二、处理WM_PAINT消息
我们以WM_PAINT消息的处理为例,在C#中处理消息与MFC的消息处理是类似的,但更为简单。MFC中需要使用DECLARE_MESSAGE_MAP来定义消息映射,在C#就不需要了。比如WM_PAINT消息,我们只要重载父类中的OnPaint虚拟方法即可(虽然在BETA1中重载父类虚拟方法的操作过程有点繁琐),方法如下:
在菜单View-Other Windows-Object Browser打开对象浏览窗口(或用CTRL+ALT+J打开),在我们的工程名下找到Form并选中,这时在右边的窗口列出所有Form类的成员函数,如图所示:
我们选中OnPaint(System.WinForms.PaintEventArgs)此时在下面会显示完整的OnPaint函数protected void OnPaint ( System.WinForms.PaintEventArgs e )我们将这一行字符串Copy下来。打开Form1.cs进行代码编辑,我们把刚才拷贝下来的函数定义复制到Form1类里面,并加上override关键字,此时我们便可以在里面添加我们的消息处理代码了,请参考如下代码段:

protected override void OnPaint ( System.WinForms.PaintEventArgs e ) {Font font = new Font("黑体",28);///定义字体:黑体,大小:28SolidBrush bluepen = new SolidBrush(Color.Blue);///创建蓝色画笔SolidBrush blackpen = new SolidBrush(Color.FromARGB(0xa0,0xa0,0xb0));///创建黑色画笔e.Graphics.DrawString("VC知识库",font,blackpen,65,25);///写字符串e.Graphics.DrawString("VC知识库",font,bluepen,61,21);///偏移4个象素用不同的颜色再写一次,达到立体效果}

对于其它消息的处理以及对其它父类虚拟函数的重载都可以采用同样的方法。

三、自定义消息的处理
为了处理的方便,在这里我们将需要使用到的自定义消息封装成一个类,类的添加过程如下:
在ClassView中选中我们的工程MSGApplication,按下鼠标右键,在弹出菜单中选择Add-Add Class,弹出Class Wizard,我们将类命名为WM,其余选项不便,确认完成类的添加。我们为WM类添加两个成员变量,见如下代码:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)
public class WM{public const int USER = 0x0400;public const int TEST1 = USER+1;}
我们在Form1中添加一个按钮,并为该按钮添加事件处理代码(假如您对这个过程不熟悉,请参考:C#学习笔记之一)
向主视窗发送TEST1自定义消息,具体代码如下:
protected void button1_Click (object sender, System.EventArgs e){SendMessage(WM.TEST1,100,200);}

消息已经发出了,在Form1中我们如何对该消息作出响应呢?我们可以重载 DefWndProc方法。

protected override void DefWndProc ( ref System.WinForms.Message m ){switch(m.msg){case WM.TEST1:///string与MFC中的CString的Format函数的使用方法有所不同string message = string.Format("收到消息!参数为:{0},{1}",m.wParam,m.lParam);MessageBox.Show(message);///显示一个消息框break;default:base.DefWndProc(ref m);///调用基类函数处理非自定义消息。break;}}

程序运行结果如图

当我们点发送消息按钮,弹出消息框并显示收到的参数。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

后记:可以预料在VS.NET BETA1的后继版本中对上述过程的操作会有很大改变,但原理是一致的。让我们期待更完美的C#展现在我们面前。


来源:http://www.tulaoshi.com/n/20160219/1600041.html

延伸阅读
在Windows系统一般都安装了至少三种输入法,在输入数据时常常会切换输入法,虽然Windows系统提供了切换快捷健,但对输入工作还是带来了不少麻烦。如果在应用程序中为用户提供智能输入法自动切换,那么这样的应用程序就显得更加专业、更加具有竞争力。不知你可用过Access,在表数据输入时Access自动切换输入法,很酷吧,现在你也可以实现这一...
本文主要介绍用C# Builder通过ODBC访问数据。并将数据导出到Excel,下面以C# Builder Enterprise+Microsoft Access 2000+Microsoft Excel 2000为例。 1.建立数据库mydb,内建表:联系人 联系人ID 名字 姓氏 地址 城市 省份 [ 相关贴图 ] 2.建立ODBC(mydb) 3.编写程序 点击菜单 Fil...
♦ 引言   在上讲中,我们介绍了如何利用Record Store把数据保存在终端内。本讲,我们将阐述MIDP Java网络的相关功能。由于N800终端只能使用HTTP通信,所以我们将以HTTP为主要范例进行讲解。到目前为止,只能制作终端内的单机型应用程序,假如利用网络,连接网络服务器,那么就能够制作出多种应用程序。 1. 利用网络  ...
----Internet无疑是一种重要的信息传播媒体,随着其迅猛发展,将会有越来越多的企业、商团、政府机关、学校、科研机构需要在Internet上建立自己的网点。建设一个网点,硬件上需要专用服务器、集线器、路由器,租用数据通信用的专线,软件上需要安装网络操作系统和Internet服务器(www、FTP和gopher服务器),更为重要的是,需要编写大量的I...
标签: Java JAVA基础
Hibernate是对JDBC的轻量级对象封装,Hibernate本身是不具备Transaction处理功能的,Hibernate的Transaction实际上是底层的JDBC Transaction的封装,或者是JTA Transaction的封装,下面我们详细的分析: Hibernate可以配置为JDBCTransaction或者是JTATransaction,这取决于你在hibernate.properties中的配置: #hibe...

经验教程

539

收藏

10
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部