相关文章推荐
腼腆的小摩托  ·  Reboot · Bootstrap v4.6·  3 月前    · 
老实的人字拖  ·  耽推 | 类型文:强制爱 - 哔哩哔哩·  9 月前    · 
英勇无比的核桃  ·  java运行时创建或修改类-JavaAgen ...·  1 年前    · 
茫然的青椒  ·  Java中JSONObject去掉转义字符_ ...·  1 年前    · 
呐喊的李子  ·  赵家骧(中国国民革命军中将)_百度百科·  1 年前    · 
Code  ›  MFC、WTL、WPF、wxWidgets、Qt、GTK 各有什么特点? - 韦易笑 的回答 -
wpf wxwidgets gtk mfc
https://www.zhihu.com/question/23480014/answer/2344510922
英姿勃勃的斑马
2 年前
MFC、WTL、WPF、wxWidgets、Qt、GTK 各有什么特点?
韦易笑
韦易笑 ​ ​
游戏开发等 4 个话题下的优秀答主

感觉我说了太多 Qt 的事情了,今天只说一下 MFC ,到底过时在哪里,都在说 "MFC 就是 xxx" 类似的话,我来补充点细节,增加点感性认识,到底 MFC 过时在哪里?想要用好 MFC 可以怎么办?

虽然 MFC 也有 DIALOG 的设计器,似乎可以拖一下控件,做个 hello world, 计算器之类的好像也很简单,但是稍微复杂那么一点就麻烦了,比如布局,MFC 里的控件只能设置绝对坐标和大小,那么如果你的窗口扩大或者缩小了,想自动改变内部特定控件的大小和位置怎么办?比如 C# 里随便设置一下各个控件的 docking 和 anchor 就能:

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();
 
推荐文章
腼腆的小摩托  ·  Reboot · Bootstrap v4.6
3 月前
老实的人字拖  ·  耽推 | 类型文:强制爱 - 哔哩哔哩
9 月前
英勇无比的核桃  ·  java运行时创建或修改类-JavaAgent-腾讯云开发者社区-腾讯云
1 年前
茫然的青椒  ·  Java中JSONObject去掉转义字符_java jsonobject put时忽略转义-CSDN博客
1 年前
呐喊的李子  ·  赵家骧(中国国民革命军中将)_百度百科
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号