留作自用,转自:https://www.cctry.com/thread-297374-1-1.html
0、开发环境:
操作系统:Microsoft Windows 7 Ultimate Sp1 x64
编译工具:Microsoft Visual Studio 2013 Professional 中文版(其实 VS2010、VS2012、VS2013、VS2015、VS2017 都可以的,操作基本相同)
1、简介:
之前VC驿站给大家推出了《实用C++》的新手入门教程,可以说把我们平时针对C++语言经常用到的知识点都做了讲解。不知道大家学习的怎么样?课后有没有真正的去敲代码练习。光看教程是不行的哦~
那么之前啊主要给大家讲解的是C++的基础语言,所以呢主要是在黑窗口的这种命令行控制台下操作的,跟界面没什么关联。但是作为C++新手来说肯定都是对于UI界面比较感兴趣,毕竟我也是从新手阶段过来的。写好了的软件执行起来能看到界面也很有成就感。可以激发大家学习VC++编程的积极性。所以从本节课开始给大家讲解下VC++中的界面开发技术。
2、Windows程序简介:
实际上Windows系统大家应该再熟悉不过了,Windows程序呢也主要分那么几种,例如:exe的可执行程序,dll的动态链接库程序,lib的静态库程序,sys的驱动类型程序等等。这些都可以用VC++来开发。
Exe类的程序从操作界面的使用角度来说又分成两种:
第一种就是我们之前一直使用的黑窗口的控制台下的程序,这种程序一般没有什么界面,都是使用命令行进行操作,比如:ipconfig、ping 之类的。使用系统提供的cmd控制台进行加载。入口点函数是 main。
第二种就是我们接下来要讲解的非控制台类型的程序,这种程序可以有界面,也可以没有界面。想要界面就调用创建窗口的API函数去创建个界面出来,不想要界面呢不创建就可以了。所以呢比较灵活。入口点函数是 WinMain。
3、Windows编程开发相关概念:
Windows API:Windows操作系统应用程序接口(Windows API),有非正式的简称法为WinAPI,是微软对于Windows操作系统中可用的核心应用程序编程接口的称法。它被设计为各种语言的程序调用,也是应用软件与Windows系统最直接的交互方式。大多数驱动程序需要对Windows系统更底层次访问接口,由所用版本的Windows的Native API来提供接口。
Windows有一个软件开发包(SDK, software development kit)提供相应的文档和工具,以使程序员开发使用Windows API的软件和利用Windows技术。
说了这么多,对于新手来说可能还是不太理解,我用通俗一点的话来解释下!
有人会问了我都学完了C++,难道还不能编写Windows系统下的应用程序吗?我还得学其他的东西吗?答案是:能,但是只能编写一些简单的控制台下的黑窗口程序。或者说只能调用C++基本语言内部的函数。
如果你要创建一个窗口,如果你要创建一个按钮,如果你要创建一个菜单,如果你要创建一个进程,如果你要做一个带界面的任务管理器,以上这些单纯使用C++语言能做到吗?答案是:肯定做不到了。
那么如何来做呢,就是要调用windows系统提供给我们的API接口,大家可以把API接口看作是系统提供给我们的工具,使用这些工具就可以做出我们想要的东西来。再举个现实生活中的例子,你学会了C++语言就好比你有了一些简单的工具,C++语言就好比是螺丝刀,扳手,钳子等等,用这些工具你可以做些简单的事情,可如果要让你造出一台汽车,你单纯使用螺丝刀、扳手一类的工具可能造出来吗?答案是:不可能。所以你还需要制造汽车的更高级的东西,比如:车床、工厂、车间等等大型的机械化设备,这些设备是制造汽车的必须品,API就好比这些设备。所以你要在windows系统上开发出更高级的软件,那么就必须调用其系统提供的API接口。这么打比方大家明白了吗?
4、基本的Win32程序:
接下来就教大家如何创建一个Win32类型的Exe程序,具体见视频教程演示。。。
怎么样大家看到了吧,代码量不少,而且操作来说比较复杂,又是初始化,又是注册窗口类,又是窗口函数什么的,一堆东西。更重要的是我们使用这个模版工程继续开发的话会越来越麻烦,比如添加个基本的按钮响应函数,这个还算是简单的了,当对一些比较复杂的控件操作时就更复杂了,比如:ListCtrl 高级列表控件,TreeCtrl 树形控件等等。
另外,当前工程模版默认创建出来的这个窗口不是对话框,所以是没办法进行拖拽控件的,对于小白来说想快速的拖拽控件做出一个窗口看来是有点麻烦了。
实际上Win32类型的工程就是调用基本的系统提供的API函数来写程序的。
5、解决方案:
既然Win32类型的工程这么麻烦,要记的东西也这么多,以后开发起来岂不是很费事儿?这个微软早想到了,其他很多公司也想到了。本身C++就是一门面相对象的,可封装的语言,所以能不能对系统提供的API函数以及复杂的开发流程进行一下封装呢,这样我们以后使用起来就能方便不少?答案是:当然可以了。所以现在市面上有很多封装好的C++库,或者说框架,比如:MFC、QT,这两个算是比较有名的,而且他们两个不仅仅是界面库,还包括很多其他的操作,比如文件管理,字符串操作,网络管理,多线程,数据库操作,注册表操作等等吧,很多方面。
那么他们两个有什么区别,我们该选用哪个呢?其实这个话题从古至今很多人在讨论。个人观点,感觉两个框架都有优缺点,大家根据自己的需要进行选择:
MFC:微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows API,并且包含一个(也是微软产品的唯一一个)应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
优点:MFC说白了就是微软自家的东西,所以VC自带MFC工程向导,VC对MFC支持的也很好。对于界面方面实现起来简单,易于上手,能快速的制作简单的UI界面,执行效率高,生成的EXE或者其他程序可以直接在Windows系统上执行,生成的文件体积也比较小;
缺点:这东西对于新手来说学起来还是有点复杂,因为是对WinApi的封装,里面用到了大量的宏,所以有时候是基于面向过程的,有时候是基于面向对象的,内部也是使用基于Windows系统的消息机制,所以学起来不是那么容易,学习周期长。如果要做成比较美观的界面,类似我们使用的QQ、迅雷、YY等软件的UI界面的话,使用MFC实现起来就比较费时费力,做起来比较麻烦倒不是说做不了,只是比较费劲而已。另外,因为是微软自己的东西,所以不能跨平台,在 Linux、Mac 系统上是别想用了。
总结:所以MFC适合开发对界面美化要求不高软件。
Qt:是一个跨平台的C++应用程序开发框架。广泛用于开发GUI程序,这种情况下又被称为部件工具箱。也可用于开发非GUI程序,比如控制台工具和服务器。Qt使用于OPIE、Skype、VLC media player、Adobe Photoshop Elements、VirtualBox与Mathematica以及被Autodesk、欧洲空间局、梦工厂、Google、HP、KDE、卢卡斯影业、西门子公司、沃尔沃集团, 华特迪士尼动画制作公司、三星集团、飞利浦、Panasonic所使用。
它是Digia公司的产品。Qt使用标准的C++和特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏。通过语言绑定,其他的编程语言也可以使用Qt。
Qt是*且开放源代码的软件,在GNU宽通用公共许可证(LGPL)条款下发布。所有版本都支持广泛的编译器,包括GCC的C++编译器和Visual Studio。
优点:Qt是一个开源的项目,可以跨平台使用,在 Linux、Mac 系统下一样可以使用。使用完全面向对象的封装机制,内部使用信号与槽机制,易于上手。开发文档丰富,支持VS插件的形式进行开发。可以制作漂亮精美的软件UI界面。省时省力。
缺点:Qt有点过度封装,而且体积也稍大,执行效率没有MFC高,程序分发打包的时候需要将Qt的核心DLL一起随程序打包,不然程序跑步起来。当然也可以用静态库的方式编译,默认只生成一个Exe文件,但这样的话程序的体积会变的很大,不管怎么说Qt生成的文件在分发携带方面的方便性上赶不上Windows的原生程序或者MFC的程序。当然如果是类似YY这种产品级的软件倒也无所谓多带几个DLL了。
总结:所以Qt适合开发对界面美化要求较高的软件。
MFC 和 QT 就好比 手动档车与自动档车一样,前者开发软件太累,但可控性更加高些。
综合以上吧,毕竟我们不是开发什么大型的软件产品,但也为了让大家以后转型方便,所以本套教程界面UI方面使用MFC来开发,除界面外的其他逻辑部分我们全用 原生CPP + SDK API 的方式来做。
这种方式目前来说我想是最好的。同时呢,大家不要着急,以后我们VC驿站会给大家出几套Qt方面的教程,让想学Qt方面的学员也有机会!
从下节课开始,我们就逐一讲解MFC控件工具箱中提供的基础的那15个控件,以及每个控件如何进行美化,如何使用开源类进行更多功能的操作等等,大家好好学习吧~
6、相关控件:
Button 按钮控件
CheckBox 复选框控件
Edit 编辑框控件
ComboBox 下拉控件
ListBox 列表控件
GroupBox 分组控件
Radio Button 单选框控件
Static Text 静态文本框控件
Picture Control 图像控件
Slider Control 滑块控件
Spin Control 数值调节钮控件
Progress Control 进度条控件
List Control 高级列表控件
Tree Control 树形控件
Tab Control 标签控件