在
.net
环境下开发
Windows
应用程序,相比于
visual studio 6.0
确实简单了不少。至少,使用起来的感觉比较直观,也只需要不多的代码就可以搭建起一个应用程序的框架。笔者在
Visual studio.net 2005
上使用
C#
边学边写了一个
Windows
应用程序处女作,感觉挺惬意。现在作一个简要回顾,算是一种总结和整理。当然了,要做好一个软件系统,需要做的工作很多,并不会因为工具的演化而可以偷懒,只是利用工具的一些便利,把重心放在更需要考虑的问题上而已。对于程序员来讲,任何时候都不敢把希望寄托在工具之上。
更深的东西我就不去说了,一是才疏学浅,尚未深入大殿,乱出狂语,吓坏了小朋友没关系,吓坏了花花草草总不好啊。二是写概要简单。简单就是美嘛,为了美,我深爱简单,就只写那么几步,完整不完整,到位不到位,那不是我现在的责任了。
开发
Windows
应用程序,简言之,就那么几步:
创建项目
创建界面
编写后台程序
调试和测试
打包发布
创建项目
创建项目是很幼儿园的工作,记住从文件开始,一直点到新建
Windows
应用程序就可以了。这个过程忽略不记。
新建完项目之后,会自动创建一个文件
:Program.cs
。这是这个应用的主程序。也就是说,运行应用程序时,是从这个文件里的程序开始的。这个文件能不能改成别的名字,我不太清楚,现在我还没兴趣去探讨这个问题。
Program.cs
文件里有一个类,最重要的是有个
Main()
函数,这个函数是应用的真正入口。它不象在
C++
里面,函数里有两个看起来头疼的参数。
那么,从
Main()
怎么进入到程序员自己编写的程序的呢?语句
Application
.Run()
就是干这工作的。
Run
函数作为一个循环函数,主要进行消息的处理
:Run
函数不断地查询应用程序的消息队列,一旦有消息出现就将其发回给
Windows,
并由
Windows
再来调用处理该消息的窗口函数,而窗口则是隐藏在应用程序框架类内部的。当消息队列中没有消息时(大多数的时候是这种情况)
,Run
函数就会调用
OnIdle
函数,从而做一些应用程序框架类或用户在程序空闲时所要做的工作。
如果既没有消息又没有空闲工作要做
,
那么应用程序就一直处于等待状态。当应用程序关闭时
,Run
函数就会调用
ExitInstance
函数
,
做一些退出前的处理工作。(注:这段解释来自互联网)
一般来讲,
Windows
应用程序首先得有窗口
(Form)
,没有窗口也就不好叫
Windows
应用程序了。有了窗口,用户才方便操作。窗口操作系统从
90
年代诞生之日起,便引领潮流,风靡世界,至今长盛不衰。可见窗口的重要性了。
要进入应用的窗口,就创建一个窗口放入
run()
函数就可以了。
Application.Run(new MainForm());
其中
MainForm
是应用程序的主窗口。怎么创建窗口,请接下来看
… …
创建界面
毫无疑问,主窗口是最为重要的主界面了。
(一)创建主窗体
创建界面的工作和创建项目是一样简单。选中项目,右键单击,在快捷菜单中选择“添加”
—
“
Windows
窗体”,取一个文件名
MainForm.cs
。取这个名字只是为了阅读方便,并不是说窗体名字就是
MainForm
。选中窗体,可以修改窗体名字属性。窗体也是一个类,窗体名就是类的名字,这个类是从
Form
类派生出来的。用这个类名(窗体名)来创建对象,
然后才能显示出来。如在
Application.Run(new MainForm());
里,
MainForm
是窗体类的名字,而不是窗体文件的文件名。
new MainFrom()
就是创建
MainForm
类的对象。
主窗体往往包含多个子窗体(
MDI
应用),因此,一般需要将主窗体设置为一个容器,用于容纳子窗体。
设置方法:选中主窗体,在属性窗口中找到
IsMdiContainer
属性,将其设置为
true
。
既然应用程序中有多个子窗体,那么从主窗体如何调用子窗体呢?使用菜单,通过点击菜单项来调用对应的子窗体,这是一种最为常用的方法了。在当前几乎所有的
Windows
应用程序上,都有菜单这个东西。那么接下来的工作就是要创建菜单了。
(二)创建菜单
非常令人惊喜的是,
Visual Studio.net 2005
提供了非常方便的工具来创建菜单。你只需要做这几步就可以了。
1、
在工具栏中找到
MenuStrip
控件。(
strip
这个词用得有意思,带子,菜单放在带子上面,呵呵)
2、
将
MenuStrip
控件拖动到主窗体
MainForm
上。一条带子就靠在主窗体的上方,紧靠着标题栏。
3、
在带子上有提示:请在此处键入。键入什么?当然是菜单名、菜单项了。键了一个,后面就自动新出现一个文本框“请在此处键入”,引导你一步步建立好菜单与菜单项。微软的东西做得好,这些细小的地方就是体现。我有一个朋友在研究交互,如此体贴方便的提示,确实算是很好的交互了,不用看说明书,一看就知道怎么操作,感谢微软,感谢
CCTV
。
运行一下看看,一个窗体跃然面前,窗体上一条带子横过窗体,带子上有你创建的一个一个菜单。一个
Windows
应用程序已经雏形初现了。
为了后面叙述的方便,假设你创建了一个菜单叫“文件”,文件下面有一个菜单项叫“调用子窗体”。如果我们点击“调用子窗体”,程序应该弹出一个子窗体,方便我们后面的操作。这是怎么调用的呢?那得先创建了子窗体再说。
(三)创建子窗体
父亲是怎么产生出来的,儿子也大同小异。子窗体的创建与主窗体的创建方法是一样的。为便于后面的描述,假设你创建了一个子窗体,命名为
ChildForm
(记住,是窗体名为
ChildForm
,而不是文件名)。
其实,到目前为止,我们所说的创建窗体,只是定义一个窗体类而已。在程序运行时它并不会自动跳出来,还需要创建窗体(类)的对象,那才是真正可以看得见的窗体。
(四)调用子窗体
我们前面说过,菜单位于主窗体上,点击菜单项显示对应的子窗体。这一过程包含了几层含义:
1、
必须对点击菜单项事件进行处理。
2、
必须使用new关键字来创建子窗体对象。
3、
子窗体对象应该绘制(通俗点就是显示)出来。
4、
子窗体与主窗体有父子关系。
先来看如何处理菜单项点击事件。
在主窗体上,点击菜单,菜单会下拉,双击菜单项(如前面定义的“调用子窗体”菜单项),此时在
Visual Studio
中会打开一个新的窗口,标签的名字为:
MainForm.cs
(主窗体的代码文件)。窗口内就是可供程序员编辑代码的区域。
在
MainForm.cs
中,自动产生了一个函数
:
private void
调用子窗体
ToolStripMenuItem_Click(object sender, EventArgs e)
{
}
这一个函数就是“调用子窗体”菜单项的鼠标单击事件的处理函数。意思就是说,点击了这个菜单项后,要干什么事情,就把代码写在这个函数里吧。
前面说到,点击了“调用子窗体”菜单项,目的就是要调用子窗体。那么,我们就在这个函数体内编写调用子窗体对象的代码就可以了。
调用子窗体对象
调用子窗体对象,一般来讲,应当先声明这个对象
private ChildForm myChildForm = null; //
先声明
ChildForm
的对象
myChildForm
。
接下来,在“调用子窗体”菜单项单击事件处理函数中创建子窗体对象
private void
调用子窗体
ToolStripMenuItem_Click(object sender, EventArgs e)
{
myChildForm = new ChildForm();
}
创建完成了之后要显示子窗体,应该加上显示子窗体的代码
private void
调用子窗体
ToolStripMenuItem_Click(object sender, EventArgs e)
{
myChildForm = new ChildForm();
myChildForm.Show(); //
将子窗体对象绘制出来
}
此时,子窗体与主窗体之间的父子关系并没有建立,主窗体的操作并不影响子窗体,子窗体也可以随便拖动到主窗体之外,点击主窗体,子窗体就隐藏到主窗体后面去了。这并不是我们所期望的,为此,必须指定主窗体与子窗体的父子关系:
private void
调用子窗体
ToolStripMenuItem_Click(object sender, EventArgs e)
{
myChildForm = new ChildForm();
myChildForm.MdiParent = this; //this
代表的是主窗体,它是
myChildForm
的父窗体
myChildForm.Show(); //
将子窗体对象绘制出来
}
这样,子窗体就不能够拖动到主窗体之外了,也不会因为点击了主窗体而使子窗体隐藏到了后面。
在这里,有人可能想,设置父子关系,也可以采用如下方式
:
this.MdiChildren = myChildForm;
道理上是这样:孩子的父亲是父亲,父亲的孩子是孩子,这两句话是一样的。但是
MdiChildren
只能读,不能写。可以获取当前窗体的子窗体,却不能进行设置,因此,此语句调试时会报错。
看起来,我们已经顺利实现了目标:点击菜单项,显示子窗体对象。
但是,假设子窗体对象已经存在了,再点击菜单项,会出现什么情况?
运行一下就会看到:会出现两个相同的子窗体对象,如果再点击菜单项,相同子窗体数更多。
这显示不是我们所期望的。它不仅会占用更多内存,还可能造成数据的不一致。我们只需要显示一个子窗体对象就可以了。
为了实现这一点,就需要对子窗体对象是否已经存在进行判断。如果子窗体对象不存在,则创建子窗体对象,并显示子窗体对象;如果子窗体对象已经存在,则只需要显示子窗体对象就可以了。
因此,上面的函数可以修改为:
private void
调用子窗体
ToolStripMenuItem_Click(object sender, EventArgs e)
{
if(myChildForm == null)
{
myChildForm = new ChildForm();
}
myChildForm.MdiParent = this;
myChildForm.Show();
}
现在,这个事件处理函数比刚才要更加合理了,能够解决出现多个相同子窗体的问题。但是,如果关闭了子窗体,再点击菜单项来调用子窗体,这仍会出现问题。这是为什么呢?请参见我的另一篇文章:
C#中通过父窗口调用子窗口的问题
。
好了,我们的基本框架已经搭起来了。至于窗体中如何显示数据库的信息,执行一些特殊的操作,那就不是本文所要关注的了。
编写后台程序和对程序进行调试和测试,我不想去论述了。讲述这两个内容就显示违背了本文追求简单的原则。
程序编写调试、测试完毕,接下来就是把它交给用户使用,使你的
Wndows
应用程序能够部署到不同的计算机上运行。自然,我们会想到制作一个安装文件,指导用户进行安装,以便正常使用。(如果不用安装,是不是就会更绿色一点呢?纳闷中
… …
)
接下来就说一说如何制作安装文件。
打包发布
Visual Studio.net
确实是一个伟大的工具,不仅方便了你进行设计和编码,提供了很多智能的功能,也为你提供了你想要的工具,如打包。
1
、点击
Visual Studio.net 2005
的“文件”菜单,选择“新建项目”
2
、在新建项目对话框的左侧,找到“其它项目类型”,点击“安装和部署”。
3
、在
“Visual Studio
已安装的模板
”
框中,点击安装向导(向导方式比较人性化,当然,也可能变得更繁琐)。
4
、设置项目的名称(假设为
” SetupGuid”
),指定位置,然后点击确定。
5
、点击启动调试按钮。期间,可能会需要安装一些文件,别忘了插入
VS
的安装光盘并指明正确位置。其它的只需要按向导一步一步执行就可以了。
6
、正确生成完成之后,在安装项目指定的文件夹下的
Debug
或者
Release
文件夹中,可以找到
setup.exe
或者安装所需的
.msi
文件。
使用生成的
setup.exe
文件或者
.msi
文件,就可以在其它计算机上进行安装使用了。