感觉我说了太多 Qt 的事情了,今天只说一下 MFC ,到底过时在哪里,都在说 "MFC 就是 xxx" 类似的话,我来补充点细节,增加点感性认识,到底 MFC 过时在哪里?想要用好 MFC 可以怎么办?
虽然 MFC 也有 DIALOG 的设计器,似乎可以拖一下控件,做个 hello world, 计算器之类的好像也很简单,但是稍微复杂那么一点就麻烦了,比如布局,MFC 里的控件只能设置绝对坐标和大小,那么如果你的窗口扩大或者缩小了,想自动改变内部特定控件的大小和位置怎么办?比如 C# 里随便设置一下各个控件的 docking 和 anchor 就能:
就能让某些控件随窗口变大而移动,某些控件随窗口变大而变大,而某些控件不变,这在任何 GUI 库里都是最基础的功能,都可以在设计器里点两下就做到的事情,MFC 却需要重载 WM_SIZE, WM_SIZING 消息来自己写代码每次手工计算所有控件的新坐标和大小,想写的通用点,还得上千行的代码,枚举所有子控件,根据额外信息重新计算位置大小,虽然 2015 的 MFC 里加了一个半成品的布局信息,但是基本没用,你在 MFC 的设计器里拖控件,都是写死坐标和大小的。
你也别说 c# 比 MFC 新,c# 的 docking 和 anchor 都是抄的 MFC 同期的 delphi 的布局方式,delphi 里叫做 align 和 anchors,c# 改都没改就换了个名字拿过去了。可以说布局是 GUI 库最基本的一个功能了,连 tkinter 都支持,MFC 却没有,而且持续十多年不思进取不增加。
再举个界面设计的常见操作,设置窗口的最小尺寸,其他编辑器里就是填写个窗口属性了事,MFC 里怎么做?要到 MainFrame 那里用 ClassWizard 找到 WM_GETMINMAXINFO 消息,为其生成一个函数,并编写:
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI) {
CRect rc(0, 0, 400, 300);
CalcWindowRect(rc);
lpMMI->ptMinTrackSize.x = rc.Width();