2023年7月17日发(作者:)
MFC,QT与WinForm,WPF简介编程语⾔的组成编程语⾔做为⼀种语⾔⾃然和英语这些⾃然语⾔有类似的地⽅.学英语时我们知道要先记26个字母,然后单词及其发⾳,接下来就是词组,句⼦.反正简单的说就是记单词,熟悉词法,句法.接下来就是应⽤了,听说读写.⽽使⽤相同语⾔的⼈⼤脑⾥都有个翻译器,可以把⾃⼰的想法翻译成语⾔然后⽤说或写表达出来,⽽听和读则把接收来的语⾔翻译成⾃⼰⼤脑能理解的思想.那编程语⾔⾸先也是像英语⼀样会制定⼀些单词,然后词法,句法.像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界⾯的).我们知道各种设计模式是满天飞,五花⼋门,但知名度最⾼的是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⼀些思想,⽐如还有类似资源⽂件的东东,像⽂件,⾥⾯⼀般是放图⽚信息,然后gs就类似MFC⾥的string table.只不过这些功能在C#中⽤的很少.那些页⾯控件也不再是放资源⽂件中.WinForm中⼀切皆使⽤⾯向对象,数据逻辑处理代码与UI代码都是在同⼀个类中,只不过C#有分部类的概念,就是说同⼀个类的代码可以分开在⼏个⽂件中.假如有窗⼝类FormArwen,则数据逻辑代码放在⽂件中,UI代码放⽂件中.只不过这两个⽂件中类的定义都要写在partial classFormArwen 其中关键字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中⽤⼀样,只不过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⽆关的代码就放⽂件中.
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689608563a270277.html
评论列表(0条)