【交流探讨】说说你本人对“事件”的理解……
一种好像是这样
protected override void WndProc(ref Message m)
{
}
另一种是:
*** +=new eventhander();
没明白这个过程究竟是怎么样的。
以前学的别的编程语言都是要么只是针对本窗体内的控件的事件的控制,
对窗体外的事件的控制怎么控制,原理??(如果这个程序是在虚拟机里运行,在windows下的事件又会不会受到影响)
protected override void WndProc(ref Message m)
{
}
另一种是:
*** +=new eventhander();
没明白这个过程究竟是怎么样的。
以前学的别的编程语言都是要么只是针对本窗体内的控件的事件的控制,
对窗体外的事件的控制怎么控制,原理??(如果这个程序是在虚拟机里运行,在windows下的事件又会不会受到影响)
===========================================很喜欢本论坛里的引用,哈哈,拿来用用============================================================
08.10.16
从网上查的一些事件的基础概念(不懂,怕找的源代码会误导同志们,先上基础概念)。
C#的事件机制是基于委托实现的。实现一个事件,要先定义一个委托类型
class1
{
public delegate void mydelegate (myEventArgs e);
public event mydelegate event1;
}
然后我们可以使用+=和-=注册、移除事件
class1.event1 += new mydelegate(new myEventArgs());
=========================================================================================
所有形如: void 函娄名(object 参数名,EventArgs 参数名);的函数都可以作为Control类的Click事件响应方法。
EventArgs是包含事件数据的类的基类,用于传递事件的细节,
参数object sender表示引发事件的对象,(其实这里传递的是对象的引用,如果是button1的click事件则sender就是button1)。
=========================================================================================
怎么把这个方法和事件联系起来呢,请看下面的代码。
this.button1.Click += new System.EventHandler(this.button1_Click); (其实button1.Click 为System.EventHandler委派的实例事件。与委派中委派实例委托给某一方法非常相似)
把this.button1_Click方法绑定到this.button1.Click事件。
=========================================================================================
从网上查的一些事件的基础概念(不懂,怕找的源代码会误导同志们,先上基础概念)。
C#的事件机制是基于委托实现的。实现一个事件,要先定义一个委托类型
class1
{
public delegate void mydelegate (myEventArgs e);
public event mydelegate event1;
}
然后我们可以使用+=和-=注册、移除事件
class1.event1 += new mydelegate(new myEventArgs());
=========================================================================================
所有形如: void 函娄名(object 参数名,EventArgs 参数名);的函数都可以作为Control类的Click事件响应方法。
EventArgs是包含事件数据的类的基类,用于传递事件的细节,
参数object sender表示引发事件的对象,(其实这里传递的是对象的引用,如果是button1的click事件则sender就是button1)。
=========================================================================================
怎么把这个方法和事件联系起来呢,请看下面的代码。
this.button1.Click += new System.EventHandler(this.button1_Click); (其实button1.Click 为System.EventHandler委派的实例事件。与委派中委派实例委托给某一方法非常相似)
把this.button1_Click方法绑定到this.button1.Click事件。
=========================================================================================
wndproc的用法(自我感觉:像是提供了一个windowsprogram即windows程序的过滤功能,符合条件的进行处理,不符合的不进行处理)
using System;
using System.Windows.Forms;
namespace AtTongxilai
{
/// <summary>
/// 只能输入数字的文本框
/// </summary>
public class NumTextBox : TextBox
{
public NumTextBox()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
protected override void WndProc(ref System.Windows.Forms.Message m)
{
int WM_CHAR = 0x0102;
if(m.Msg == WM_CHAR)
{
if(((char)m.WParam >= '0') && ((char)m.WParam <= '9') ||
(int)m.WParam == (int)Keys.Back || (int)m.WParam == (int)Keys.Delete)
{
base.WndProc (ref m);
}
}
else
{
base.WndProc (ref m);
}
}
}
}
using System;
using System.Windows.Forms;
namespace AtTongxilai
{
/// <summary>
/// 只能输入数字的文本框
/// </summary>
public class NumTextBox : TextBox
{
public NumTextBox()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
protected override void WndProc(ref System.Windows.Forms.Message m)
{
int WM_CHAR = 0x0102;
if(m.Msg == WM_CHAR)
{
if(((char)m.WParam >= '0') && ((char)m.WParam <= '9') ||
(int)m.WParam == (int)Keys.Back || (int)m.WParam == (int)Keys.Delete)
{
base.WndProc (ref m);
}
}
else
{
base.WndProc (ref m);
}
}
}
}
使用+=和-=注册、移除事件,只注册不移除的话网页加载完成显示两次(有时候三次,不正常)移除后正常)
以下部分是自己做的源代码在测试。所以。。。。如果有可看度,最好能给加个精什么之类的
using System;
using System.Collections.Generic;
using
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
namespace WindowsApplication12
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
webBrowser1.Navigate("http://www.baidu.com");
webBrowser1.DocumentCompleted+=new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
webBrowser1.DocumentCompleted -=new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);//其实我刚发现,这两条命令根本就可以没有.但是也在发挥作用.
}
public void sst()
{
MessageBox.Show("哈哈");
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
MessageBox.Show("加载完成任务");
sst();
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
以下部分是自己做的源代码在测试。所以。。。。如果有可看度,最好能给加个精什么之类的
using System;
using System.Collections.Generic;
using
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
namespace WindowsApplication12
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
webBrowser1.Navigate("http://www.baidu.com");
webBrowser1.DocumentCompleted+=new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
webBrowser1.DocumentCompleted -=new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);//其实我刚发现,这两条命令根本就可以没有.但是也在发挥作用.
}
public void sst()
{
MessageBox.Show("哈哈");
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
MessageBox.Show("加载完成任务");
sst();
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
[[it] 本帖最后由 skyzoneskyzone 于 2008-10-18 21:02 编辑 [/it]]