随想录(MFC开发有感)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

 

    虽然之前也写过一些mfc的文章,但是时间长了也会忘了。对于很多同学来说,用C#开发图形界面又快又方便。但是像我们这些从VC6.0就开始写软件的老人来讲,用MFC开发代码还是挺顺手的。今天看到MFC从VS2017版本开始,已经不是默认安装的了,心中还是有一些感慨的。

 

1、MFC只是WINDOWS API的封装

    开发windows图形界面程序,不用MFC也是可以的。只是用MFC比较方便而已。你可以不用敲代码、或者使用很少量的代码,就可以做出你想要的功能的。MFC创建了数百个类,这些类将API全部封装起来,从控件到定时器、多线程,事无巨细,使用起来不是特别复杂,当然前提是你比较会使用MSDN来查询信息。

 

2、MFC需要你精通C++

    客观来说,MFC的学习门槛还是比较高的。所有编程语言中,C++是公认比较难学的语言,特别难精通。很多人可以说精通C,但是如果自诩精通C++恐怕还是打一个问号的。C++里面的类、友元、继承、虚函数、多重继承、模板、泛化、STL、Boost等等,能学会使用就很不错了的。况且为了实现MFC功能,早期的WINDOWS工程师使用了好多的编程技巧,阅读MFC源码有一定难度的。

 

3、MFC的开发思路

    虽然有这样、那样的困难,但是MFC用的时间长了,你会发现MFC开发并不难。从Application、MainFrame、ChildFrame、Doc、View,整个架构是一脉相承的。即使好长时间不写MFC代码了,过一段时间重新把代码拿过来看,熟悉起来也不是很复杂。Application负责整个应用的创建,将ChildFrame、Doc、View绑定在一起,进而构建MainFrame。MainFrame负责窗体搭建、ChildFrame负责子窗体搭建,Doc负责文档搭建,View负责图形化显示,基本上就是这么分工的。

 

4、最新的MFC

    观察最新的MFC代码,特别是VS2015之后,你会发现多了ClassView、FileView、OutputWnd、PropertiesWnd、ViewTree这五个文件。前面4个的主要功能是在MainFrame里面添加额外的窗口显示,这也符合现在的主流界面要求,类似于eclipse界面一样。而ViewTree结构则主要是被ClassView和FileView使用。至于MainFrame、Doc、View还和之前一样,都是在App类里面被调用的。

 

5、使用最多的MFC类型

    相比较MutilDocument和SingleDocument,基于Dialog的MFC才是用的最多的形式。毕竟用MFC做工具还是比较方便的。如果本来就有一个命令行工具,那么只要结合一个对话框,就可以让这个工具变得很好用。相比较而言,使用MultiDocument和SingleDocument有一定的难度,文件也比较多,对程序员有一定要求,在使用场景上并不是很多。如果对MFC不是很了解,很容易写出来的代码千疮百孔,动不动程序挂掉那也不是稀奇的事情。而基于Dialog的MFC一般就三个类,CDialog、CAboutDialog、CDialogApp,使用起来不要太爽。

 

6、重视使用类向导

    MFC很多的代码都是自动生成的,所以大家在使用的时候一定要重视类向导这个功能。通过类向导,你可以自由添加变量、函数、处理消息、将控件转变成类成员变量等等。目前在VS2015上面,类向导的界面是这样的,

 

7、后续的发展

    从目前的发展趋势看,.net和C#开发应该是微软重点推荐的开发模式。如果是从头研发的新软件,那么使用.net开发也无可厚非,但是如果考虑到以往MFC软件的维护、或者是编写小的工具软件,代码行数在几百到几千行之间,使用MFC开发也是不错的一个选择。当然对于那些高手来说,使用MFC开发商业软件也是可以的,比如Emule就是MFC开发的。按照WINDOWS的习惯,微软公司全部放弃MFC应该不太可能的,毕竟目前在市场上面还有那么多的存量软件,但是不推荐MFC倒是一个不争的事实。我倒觉得,学好MFC、用好MFC、并且那么多开源MFC代码,都是很好的学习资料,努力掌握一个架构也不是坏事。

 

8、最后的话

    不管是MFC、还是WIN32、QT,一个合格的开发者还是应该有一个自己比较擅长的框架平台。全部都使用WIN32开发或者QT开发也未尝不可,但是一定要做到了解和精通,可以独立解决所有相关的架构问题。不管什么样的框架,毕竟还是为项目负责的,一个低质量、开发进度得不到保证、不好调试的软件,总归是得不到长远发展的。

 

ps1:

    当初为了实现,MFC充分利用c++的各种特性,包括全局构造函数、类静态变量、类静态函数、参数引用、手动链表、类函数指针等各种特性,但是抛却这些特性,其实MFC本质上还是给我们提供了一个相对简单的GUI环境,对于快速开发上位机工具还是大有裨益的。如果对这些特性不是很了解的朋友,可以参考我之前的blog,了解一下这些属性是怎么实现的。

 

    mfc之全局变量,https://blog.csdn.net/feixiaoxing/article/details/52751748

    mfc之类型识别,https://blog.csdn.net/feixiaoxing/article/details/52760518

    mfc之创建对象,https://blog.csdn.net/feixiaoxing/article/details/52831372

    mfc之数据保存,https://blog.csdn.net/feixiaoxing/article/details/52899947

    mfc之消息注册和消息传递,https://blog.csdn.net/feixiaoxing/article/details/53071842

 

ps2:

    要说这里面属性比较复杂的,我觉得还是类函数指针,建议大家多多练习,比如像这样,

#include "stdafx.h"

class parent
{
public:
	parent() {}
	~parent() {}
	void process() { printf("parent\n"); }
};

class child : public parent
{
public:
	child() {}
	~child() {}
	void process(){ printf("child\n"); }
};


int main()
{
	typedef void (parent::*func)();
	func f = static_cast<func>(&child::process);
	child c;
	parent* p = &c;
	((p)->*f)();
	return 0;
}

 

  • 1
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页
评论

打赏作者

嵌入式-老费

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值