关于WPF,Win32,MFC的棘手问题

Mac*_*ack 10 api wpf winapi mfc

假设您是一名具有C++和C#基础知识的IT学生.我们假设您要设计以下应用:

  1. 需要提供一些性能,如归档程序,加密算法,编解码器
  2. 利用一些系统调用
  3. 有一个gui

并且你想学习一个Api,它可以让你编写像前面描述的那样的应用程序,并且:

  1. 是主流
  2. 是未来的证据
  3. 有权让你找到一份体面的工作
  4. 很容易 - 我的意思很容易像VCL,不像winapi那么容易

那么,做出这些假设,你会选择什么Api?MFC,WPF,其他?我非常喜欢VCL和QT,但它们不是主流,我认为很少有雇主会要求你在QT或Visual C++ Builder中编写应用程序......

谢谢你的回答.

sta*_*ica 14

注意:以下答案是在几年前编写的,其中考虑了桌面应用程序开发.今天(2018年),您可能只是构建一个Web应用程序,最终得到一些合理的跨平台和独立于设备的东西.(例如,在服务器端使用ASP.NET Core,在客户端使用诸如React,Vue.js或Angular之类的UI框架/库).

  • Win32 API - 如果我是你,我会忘记它.直接通过Win32 API编写Windows应用程序只有在使用纯C进行编程,或者您确实需要进行大量系统调用时,或者如果您担心更"舒适"引入的额外开销时才有意义.平台或框架(例如下面提到的那些).直接通过Win32 API编程UI是令人厌倦,凌乱的,你需要处理很多细节.它根本不是平台独立的,但你可能会或可能不会担心这一点.

  • MFC - 如果您使用C++进行编程并在Windows平台上修复,则可能是一个选项.我从来没有理解它的优点,除了它使Win32 API更加舒适(AFAIK它基本上是围绕Win32 API的面向对象包装器的集合,它带走了它的一些复杂性/混乱).此外,它也不是非常独立于平台.

  • Qt,wxWidgets - 相当普遍的UI框架.可能是平台独立性发挥作用的好选择.AFAIK这两个框架都是针对C++语言的.

  • WinForms(.NET) - 与MFC类似,它也基于Win32 API(USER32和GDI +).AFAIK WinForms框架现在被移植到Mono,因此有点跨平台.但是,它并不是最先进的技术.对于复杂的UI,它有时也会有些迟缓.如果我今天必须决定使用哪个框架,我宁愿选择......:

  • WPF(.NET) - 比WinForms更现代,具有更多图形功能,显然,渲染速度更快,因为它不再基于Win32 API(GDI).(它运行在.NET上,我找到了一个很好的开发平台.用C#编程比用C++编程更容易恕我直言,这也是针对Win32 API,MFC,Qt和wxWidgets的一个参数.)注意WPF不是跨平台的,它目前只存在于Windows平台上.

  • 当然还有Java,包括它附带的UI框架.我不能说太多,因为我不是Java人,但我可以想象Java将是平台独立性的最佳选择; 它是某些行业(例如移动电话,银行业务,由于非常可靠的JVM和安全考虑因素)的主导平台(通过.NET).

因此,如果您计划主要使用Microsoft世界,我的建议将是.NET框架和UI的WPF .请记住,您仍然可以通过P/Invoke使用Win32 API(您不会接近"系统调用").

  • @Mack - 我会签出C#并做一些测试,看看它的运行速度有多快.当然,托管语言会有一些开销,但除非你真的*强调CPU(达到几个百分比的性能差异意味着很多),否则你可能并没有真正注意到.NET的速度要慢得多.当然这取决于你打算用它做什么...... (4认同)

sti*_*k81 7

如果您喜欢使用C#进行编码并使用.Net框架,我建议您查看WPF.WPF是一个很棒的GUI框架,你可以做任何事情 - 并使它闪耀!WinForms可能更容易掌握,但我会说WPF更"未来证明".另一个好处是WPF与Silverlight非常相似,所以如果你能很好地处理WPF,你也应该能够编写Silverlight应用程序 - 如果你感兴趣的话.请不要费心学习MFC ..我不敢相信有很多人今天使用MFC的原因不是他们之前使用它的原因,也没有机会改变...

.Net程序员有很多好工作,因此除了C#之外还能够处理一些GUI框架,并且有关.Net框架的一般知识是值得的.

当谈到能够"提供诸如存档器,加密算法,编解码器等一些性能"的观点时,这实际上不应该取决于您选择的GUI框架.这种代码将在GUI层之外的层中写入,并且通常将绑定到GUI.使用WPF,你可以在一些独立于GUI层的类中用C#编写加密算法,然后用WPF编写的View将绑定到C#代码并从此处获得答案.但是,如果你使用WinForms,你仍然会做同样的事情,性能依赖于算法 - 而不是GUI.

在开始使用WPF时,有很多关于SO的问题可以帮助解决这个问题.所以你应该通过快速搜索找到很好的帮助.

祝好运!