【代码剖析】Windows窗体应用程序.Designer.vb文件剖析。
vb2010吧
全部回复
仅看楼主
level 9
lipeiyi2006 楼主
2012年08月27日 11点08分 1
level 9
lipeiyi2006 楼主
新建一个Windows窗体应用程序,名称默认为WindowsApplication1,之后在"解决方案资源管理器"中,点击上面的"显示所有文件",打开默认的添加的Form1.vb节点,下面有一个Form1.Designer.vb文件和Form1.vb代码文件:
其中:
Form1.Designer.vb文件定义窗体的各种控件和事件,以及初始化,析构。
Form1.vb存储编写的代码。
这里主要讲解Form1.Designer.vb文件,因为这个文件大家平时可能都看过,但并不知道什么意思或者有什么作用,了解它将加深你对窗体应用程序的理解。
2012年08月27日 11点08分 2
好评
2024年10月09日 09点10分
level 9
lipeiyi2006 楼主
打开Form1.Designer.vb,映入眼帘的第一行就是
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
我们可以从注释中得到关于它的解释:
Partial -- 局部的,这是一个局部的Form1类,Form1类??没错,Form1.vb文件里面也有一个Form1类,为嘛有两个?
嗯,这就是Partial的意义了,我借鉴百度知道上的一位朋友的回答:
partial 信息只对编译器有用,编译器在编译时看到对某个类的描述是“碎”的(partial 的),它会去其他地方收集该类的其他碎片,然后把所有的该类的碎片组合成完整的一个类,再对其编译。-- @jizhongbo
简单地说就是你可以把类写在不同的文件中,类名相同,用partial修饰后,IDE会找全类的碎片,然后粘在一块儿,形成完整的一个类。
2012年08月27日 11点08分 3
level 9
lipeiyi2006 楼主
【引申】如果你使用的是VS2012,那么你可以在“解决方案资源管理器”中展开Form1.vb看到类的结构,除了我们双击窗体创建的Load事件外,还有两个函数,一个变量,
但我们并未在Form1.vb代码文件中定义这些函数和变量,其实他们就是从
Partial Class Form1里面来的。

2012年08月27日 11点08分 4
level 9
lipeiyi2006 楼主
Inherits System.Windows.Forms.Form
学过OOP大家一定不会陌生,这个Form1继承.NET库里面的Form类。
 'Form 重写 Dispose,以清理组件列表。
 <System.Diagnostics.DebuggerNonUserCode()> _
 Protected Overrides Sub Dispose(ByVal disposing As Boolean)
  Try
   If disposing AndAlso components IsNot Nothing Then
    components.Dispose()
   End If
   Finally
    MyBase.Dispose(disposing)
   End Try
 End Sub
这个是一个重写基类Dispose()方法的析构函数,好好地为什么要重写呢?
原因是components,作为组件管理器,它可是掌控者窗体里面所有的控件,不管是原生的也好,第三方引用进来的也好,只要对它调用Dispose()方法,那么就将对所有的窗体控件进行析构,释放内存资源,避免内存泄露。并且最终都要调用基类的MyBase.Dispose()方法来释放其他资源。当这个重写方法被调用,就意味着应用程序即将结束。
2012年08月27日 11点08分 5
level 9
lipeiyi2006 楼主
 'Windows 窗体设计器所必需的
 Private components As System.ComponentModel.IContainer
正如上面提到的,components 组件管理器。
 '注意: 以下过程是 Windows 窗体设计器所必需的
 '可以使用 Windows 窗体设计器修改它。
 '不要使用代码编辑器修改它。
 <System.Diagnostics.DebuggerStepThrough()> _
 Private Sub InitializeComponent()
   components = New System.ComponentModel.Container()
   Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
   Me.Text = "Form1"
 End Sub
这个有意思了,
“可以使用 Windows 窗体设计器修改它”意味着我们拖放控件,创建用户事件都将自动修改这InitializeComponent()里面的代码,
“不要使用代码编辑器修改它。”这句话其实是提醒程序员不要随便修改,一旦没改好可能窗体都见不到了。
InitializeComponent()初始化组件,包括控件的实例化和属性设置。

2012年08月27日 11点08分 6
level 9
lipeiyi2006 楼主
为了更直观一点,我们先在窗体上轻轻放上一个按钮Button1,点一下就好,一切属性默认,然后可以看见Form1.Designer.vb文件被打了*号(被修改了),打开看看,借助IDE的黄条我们可以很清楚的看见:
Form1类里面声明了一个Friend带事件的变量Button1,并且IDE重新写了一遍InitializeComponent()函数,里面有对Button1的实例化,然后属性设置,这些属性来自“属性窗口”,这意味着我们在属性窗口中对控件所作出的更改都将反映到这个函数中来用代码设置一次。

2012年08月27日 11点08分 7
level 9
lipeiyi2006 楼主
这里面值得关注的是Me.SuspendLayout()和Me.ResumeLayout(False),挂起和恢复窗体布局,我们每重新载入一次Form1的设计器,这里面的代码将模拟执行一次,来显示到设计器中,因此,我不建议一个窗体上放很多控件,这将加重IDE的负担,以及严重占用系统内存。
控件一多,你在切回设计器的时候,明显会感觉到卡顿闪烁现象,不妨看看InitializeComponent()函数里面的代码吧,长的吓死你。
2012年08月27日 11点08分 8
level 9
lipeiyi2006 楼主
【题外话】如果IDE没给我们提供什么设计器,那么我们可以通过代码来创建它们,首先你需要声明一个控件的成员变量,就像:
 Friend WithEvents Button1 As System.Windows.Forms.Button
然后前往InitializeComponent()函数实例化它
 Me.Button1 = New System.Windows.Forms.Button(),然后设置其属性
 Me.Button1.Location = New System.Drawing.Point(72, 100)
 Me.Button1.Name = "Button1"
 Me.Button1.Size = New System.Drawing.Size(75, 23)
.....
就行了。
【关于早期IDE】早期IDE中没有Designer.vb文件,相反,IDE将Designer.vb里面的代码全部放在窗体代码文件开头。学了本文你或许就知道什么意思了。
PS:本文由百度VB2010吧吧主lipeiyi2006(ybusad)在百度VB2010吧首发,随便转载,转载请说明出处。
2012年08月27日 11点08分 9
level 13
你在美国么?每天那么早?
2012年08月28日 00点08分 10
谁说我在美国的?
2012年08月28日 02点08分
level 1
继续吧。鞋了
2016年02月05日 09点02分 11
1