使用.net开发Windows应用程序的过程概要

转载 2007年09月21日 09:40:00
.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文件,就可以在其它计算机上进行安装使用了。 

相关文章推荐

OS X 上使用.NET开发应用程序(转载)

Linux/Mono, Mac开发

如何使用VS2005的VB.net开发WinCE应用程序

Visual Basic .NET属Basic系语言,其语法特点是以极具亲和力的英文单词为基础标识,以及与自然语言极其相近的逻辑表达,有时候你会觉得写VB.NET代码就好像在写英文句子一样,从这个角度...

实例分析ASP.NET开发三层结构应用程序

传统两层结构   在过去应用系统开发过程中,CLIENT/SERVER体系结构得到了广泛的应用 。其特点是,应用程序逻辑通常分布在客户和服务器两端,客户端发出数据资源访问请求,服务器端将结果返...

有简易通用权限管理后台的快速C# ASP.NET开发的例子应用程序卖给了曾长期开发JAVA银行程序的大哥

前几天,有一个已经有2年不做程序开发的大哥,购买了一套我的程序,其实这个大哥的水平也很厉害,但是由于有1-2年没做开发工作,以前的积累也都放弃了,现在可能是客户找他开发应用程序,要求的时间也比较短,所...

译文:使用MVC5的Entity Framework 6入门(九)——为ASP.NET MVC应用程序使用异步及存储过程

为ASP.NET MVC应用程序使用异步及存储过程这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻...

VB.NET实现windows应用程序开发串口调试并实时实时保存数据和画图

自己最近做了一个关于VB.NET开发的串口调试程序,实现了和下位机DSP的通信,并且实现了实时画图功能,DSP把整形数据(占4个byte),左移后通过DMA方式先发高位,接收后用位段方式转化为整型。同...

使用API,手工生成 Windows应用程序全过程(图解+文字说明)

使用API,手工生成 Windows应用程序全过程(图解+文字说明)
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)