williambirkin

恭喜发财!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

今天跟别人争一个问题。
A窗体show出B窗体后,B窗体再show出C窗体。
这是关闭B窗体,C窗体是否还能显示。
我的想法是,C窗体是B窗体show出来的。
那B窗体应该是C窗体的父窗体,或者说C窗体与B窗体之间存在着依存的关系。
因为我觉得C是B声明并show出来的。
就如同一个类里面声明的变量。
类不存在了变量占用的内存也会释放放掉。

但是回来我测试了一下发现。实际情况不是这样。
即使你关闭了B后C依然正常显示。
只要A关闭,C就不会消失。

呵呵……这个问题很有趣。到底是什么在支持C不消失的能?
我想起很久以前在书店无意看到的一本书上讲过窗体如何显示的原理。
依稀记得“消息循环”几个字。于是上msdn查了一下。
主要是自己对windows的底层不了解才有此误解。

相信以前做vc程序的人对windows消息机制是有所了解。
在.net里面窗体的显示依然是离不开windows消息机制的。
只不过.NET组件已经把这些麻烦的windows编程已经给封装起来了。

在Main()中,利用Application.Run()来将Form窗口显示出来,并进入消息循环。
程序的执行过程中,Application.Run()一直未结束。
当再show出的别的窗体的时候窗体也会被加入到该进程的消息循环中。
只要不人为关闭窗体,窗体将一直被Application.Run()一直维持。

所以窗体的是否关闭释放是跟他在哪里定义没有关系的。
只跟维持他的进程有关。
一旦Application.Run()结束或者进程退出,窗体才会关闭。

在这个程序员变成农民工的时代,只有懂得更多、懂得更深才能提高自己的价值。
努力学习!努力挣钱!

posted on 2008-10-06 20:17  williambirkin  阅读(948)  评论(0编辑  收藏  举报