在winform程序中,在开始项目中Main函数中有
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new Form1());
Form1 frm=new Form1();
frm.show();
}
其中的弹出的窗体,界面我们无法操作。Formshow()改方法继承与control的show()其主要是把自身的visiable属相设为true.
MSDN对Application.Run的说明是:在当前的线程启动一个标准的应用程序(消息循环),并且显示指定窗体。
而From.ShowDialog(),主要实现如下
public DialogResult ShowDialog(IWin32Window owner) { .....
if (this.dialogResult == DialogResult.None) { Application.RunDialog(this); }
..... return this.DialogResult; }
上面我们可以看到主要调用Application.RunDialog(this); 此函数里面调用了ThreadContext.FromCurrent().RunMessageLoop(4,newModalApplicationContext(form));为程序建立一个消息循环,从而像windows那样进行循环消息机制的处理。
windows为每个windows程序维护一个消息队列,当用户输入事件的时候,windows就把这个事件转换为消息,而消息通过while循环来处理。其中消息包括比如鼠标点击,键盘输入等消息。
winform中消息循环还在存在,主要用一个保护函数WndProc来封装的,主要如下
protected override void WndProc(ref Message m) { if (m.Msg == 7) { this.WmSetFocus(ref m); } else { base.WndProc(ref m); } } 与Win32里面的那个一模一样。实际上通过重写这个方法我们可以实现一些正常做法难以实现的东东。 |