编程语言的组成
编程语言作为一种语言天然和英语这些天然语言有相似的地方.学英语时咱们知道要先记26个字母,而后单词及其发音,接下来就是词组,句子.反正简单的说就是记单词,熟悉词法,句法.接下来就是应用了,据说读写.而使用相同语言的人大脑里都有个翻译器,能够把本身的想法翻译成语言而后用说或写表达出来,而听和读则把接收来的语言翻译成本身大脑能理解的思想.c++
那编程语言首先也是像英语同样会制定一些单词,而后词法,句法.像int ,char这样的类型关键字,或其余一些关键字就是单词.但这样的语言机器不认识的.因此就要个编译器来翻译成电脑能认识的01串.编译器就像大脑中的翻译器了.因此简单的提及来,一些语法规则加一个编译器就能够标志一门新的编程语言产生了.但语言内置的的都是些很是基本的操做,你要实现个啥复杂点的功能得写不少不少代码,因而有些人就先把不少经常使用的操做写好代码放那,你之后只管去调用.造好了不少轮子等着你用就行.这就是开发一些库(library)让你调用.在面向对象的语言中通常就叫类库,就是一堆堆的类嘛.若是类库足够强大,咱们也能够叫做框架.反正咱们能够简单的把框架理解为一些功能强大而且联系紧密的类库.算法
MFC和QT是C++中常见的GUI框架,而WinForm和WPF是C#中经常使用的框架,不过咱们通常不多叫WinForm框架,可能直接叫图形控件类库更多点.反正只是个称呼罢了,爱咋叫就咋叫.另外WinForm与WPF(即Windows Form与Windows Presentation Foundation,用于windows的上的桌面应用开发)都只是提供了一堆GUI类库,而MFC与QT除了一堆GUI类库外还提供了其余不少类.功能更强大.编程
GUI的重要性
GUI即graphical user interface(图形用户界面).可能不少人以为整那些页面是个没啥技术含量的活.但实际上不少时候用户可不知道你后台代码咋写,也无论你咋写.他们看到的只有UI,以为页面看着舒服,用起来性能不是太差,用个专业点的词说就是用户体验很好,那这就是个好软件产品.像苹果公司的产品这么受欢迎其中很重要的一个缘由就是UI作的漂亮,让人以为很酷.咱们开发一个软件产品时,若是站在开发者的角度(站其余角度可能不同)一个软件无非就是保存数据,处理数据,数据间一些逻辑操做,而后经过一个好友的UI界面与用户交互(固然有少数后台软件是不须要UI界面的).windows
咱们知道各类设计模式是满天飞,五花八门,但知名度最高的是MVC模式(model , view,controller).就很好的体现了这一点,model + controller是数据处理那一块,而view就是UI界面.实际上QT,MFC,WinForm,WPF都至关于简化的MVC模式,由三层变成两层.model +controller没作区分,弄成一层了.而view这一层则是单独弄出来,UI与与数据的逻辑处理代码的分离使得条理清晰,便于理解与维护.并且更重要的是不少UI控件都是作好了的,你直接拖来用不行.设计模式
另外你可能可能据说过STL(standard template library),标准模板库至关于把数据结构及对数据的操做(算法)这些经常使用的东东都作好给你调用,至关于把数据结构和算法那些思想实现成通用的代码供你调用.数据结构
为啥把这四个框架放一块儿来讲呢,由于四者以前有相似的地方.相同语言之间的框架有类似那是毫无疑问,但实际上不一样语言之间的类库也有相似的地方了.C++中的MFC和C#中的WinForm有点相似,而C++中的QT与C#中的WPF又有点相似框架
MFC与WinForm
前面讲了这四个框架都是简化的两层的MVC模式.MFC中数据的逻辑处理天然是放后缀为h,cpp的这些文件中.而页面相关的那一堆东东放资源文件rc后缀的文件中.通常是一个project对应一个rc文件,但也能够多个project共用一个rc文件.固然在VS这开发环境中不会由于全部信息放rc文件中就全部页面控件堆一块儿了.在Resource View能够看到一个个分开的Dialog,每一个Dialog就是一个页面,里面装着button等一些控件.固然资源文件还能够放其余资源的好比String Table,Bitmap之类的.若是你查看rc文件里的code,都是一堆begin 和end包起来的乱七八糟的东东.内容天然是控件的一些属性.code语法跟c++标准语法没半毛钱关系.也不知道是按啥语法组织的.数据结构和算法
分开了UI层,若是那些处理数据逻辑的代码要与UI交互就靠资源ID去关联.好比不少类能够共用一个Dialog页面,固然了不少时候咱们通常是一个class对应一个dialog的.MFC中UI页面与后台代码交互起来很不方便.好比要让某个控件(button,combobox之类的)与某个变量对应起来还得在DoDataExchange那函数里面写点代码关联起来.若是要点button要对应啥操做还得经过begin_message_map这样的宏来关联下.把某个控件送出的消息与一个函数对应起来的.固然了由于全部控件都继承自CWnd这类,因此也能够经过这类的一些函数去直接操做控件,好比GetDlgItem这样的函数,传资源ID作参数就行.编程语言
WinForm中也遗留了MFC一些思想,好比还有相似资源文件的东东,像Resources.resx文件,里面通常是放图片信息,而后Setting.settings就相似MFC里的string table.只不过这些功能在C#中用的不多.那些页面控件也再也不是放资源文件中.WinForm中一切皆使用面向对象,数据逻辑处理代码与UI代码都是在同一个类中,只不过C#有分部类的概念,就是说同一个类的代码能够分开在几个文件中.假若有窗口类FormArwen,则数据逻辑代码放在FormArwen.cs文件中,UI代码放FormArwen.Designer.cs文件中.只不过这两个文件中类的定义都要写在partial class FormArwen 其中关键字partial是C#中独有的关键字,用来表示分部类,一个类能够在多个文件中定义.这里的UI代码也彻底是标准的C#代码,不像MFC资源文件缺少可读性.并且你彻底能够把UI代码拷贝到数据逻辑代码中,放一块儿也彻底没问题.函数
窗口中每个控件都有一个name,至关于mfc中的资源ID吧,而后你在代码中调用控件时直接用这个名字就行,就至关于一个变量名字.因此代码与UI交互起来很是方便,另外MFC中的消息机制在这里被封装成了事件(event),你选中任意一个控件而后在它的propterties 的event页面中选择任意一个事件点击下就会自动生成一个类,你往类中直接写要处理的事件代码就行.这实际上就是把win32 API中复杂的消息机制简化为一个event,用户用起来很方便,也不用管背后的复杂逻辑.MFC虽然对消息机制作了些封装,但封装的还不够好.
因此WinForm相对MFC而言,UI代码与数据逻辑处理代码交互更简单,更条理清晰,易于理解.背后一些复杂的细节都封装了不用用户管了.并且UI控件是功能更强大,看起来更漂亮啊.
QT与WPF
同为C++的GUI框架,QT与MFC不那么类似,那种逻辑反而更接近C#的wpf框架一点.首先不是全部UI相关代码都像MFC同样整到一个rc文件,而是一个UI页面有对应一个后缀为ui的的xml文件.而数据逻辑处理代码是放h,cpp文件中.并且这三个谁的名字都相同. 而若是要与控件交互也跟wpf同样方便,每一个控件有个objectName,至关于MFC的资源ID号,而后调用控件时直接用这个名字就行,固然前面要加个指向自身所在类的指针.好比有类Arwen,有button名为btn,则通常是先Arwen* ui; 而后ui->btn就行.实际上跟wpf中用this.btn同样,只不过wpf中this前缀是能够省略的. 另外QT里面也没有MFC中的消息处理概念,而是封装成一个叫signal / slot的机制.这跟C#中的WinForm事件(event)很是相似,例如你右击QT中的一个按钮,而后右击go to slot选择一种signal,就至关于C#里面的各类类型的事件,固然signal的各种要少点.而后slot就是事件对应的处理函数.
WPF也是一个UI页面对应一个文件,后缀为xaml的文件,xaml全称是eXtensible Application Markup Language咱们能够把它当作一种特殊的xml文件.而QT里面的ui文件就是标准的xml文件了啊.而后其余UI无关的代码就放xaml.cs文件中.
应该说从符合咱们思惟习惯的角度来讲WinForm是最容易理解的,UI页面对应的代码彻底是标准C#代码. 而MFC页面对应的rc文件,QT页面对应的xml文件,WPF页面对应的xaml文件都不是标准的C++或C#代码.不太符合咱们的思惟习惯.————————————————版权声明:本文为CSDN博主「聪明的笨蛋」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。原文连接:https://blog.csdn.net/weiwenhp/article/details/8442553