桌面程序设计已通过时了,还有没有必要学习MFC?

“如今已是人工智能、大数据的时代,云+端才是王道,桌面程序设计已通过时了,还有没有必要学习MFC?”
这是许多困扰刚刚入行朋友的问题,不能否认,因为python、Java等开发语言和环境的流行,Visual C++的应用范围也相应缩小。
“有人说如今c++愈来愈接近边缘性语言?c++程序员之后的发展方向在那里,我学习MFC会不会被淘汰?”
的确C++做为普及性应用程序设计语言的地位已经再也不,可是它做为系统程序设计语言的地位没变。 笔者我的的浅见在于:一个系统程序员的核心优点之一就是对计算机装置的透彻理解。在笔者求学阶段,笔者的导师曾经有过这样的指导,对于本人的影响很是深入:
“大家以为大家学计算机这个专业最大的优点是什么?是会编程序吗?会写算法吗?”
“论写算法,大家不如数学方向的同窗,他们每天接受逻辑思惟训练,抽象能力的培养,大家不占优点”
“论写业务逻辑,好比信息管理系统,大家不若有行业经验的懂开发技术的人员,由于大家在业务理解上不占优点”
“写操做硬件,大家不如写自动化,机电一体化的,不如通讯的,他们理解协议,用代码指挥硬件的能力比大家也要强”
“那么,计算机专业的核心优点在哪里?”
“我认为必定是在大家对整个计算机装置的理解,这个才是大家要强化的技能核心”
正是由于此,笔者才对进入行业领域的C++学习者不断建议:从各类角度提高本身的对计算机装置的核心理解。
那么理解计算机装置的一种可选路径在哪里呢?笔者认为莫过于对操做系统的学习和探索。毫无疑问,当前在PC市场中最为人们所熟知的操做系统就是windows了。对于普通用户来讲,当他双击word图标,启动word,开始打字,排版,插入图片的时候,他必定认为是本身在处理办公业务。当这个用户按下键盘a,打出一个字母,按下鼠标,圈出一段文字,他必定认为是本身“在写,在画”这个内容。可是做为一名开发人员来讲,你又是如何理解这种行为呢?
实际上,真正在写,在画的并非这位用户,而是word这个程序。从运行原理来讲,恐怕这样的描述更加精准。
桌面程序设计已通过时了,还有没有必要学习MFC?
其实,这个呈现出来的过程当中word与windows操做系统交互被用户从逻辑上忽略了。而咱们程序开发人员的任务其实是在两端编程
一方面,咱们接受用户的输入,让操做系统感知到咱们应用程序的存在,并将其作相应的处理逻辑;
另外一方面,咱们将处理好的逻辑经过windows操做系统的帮助以友好的方式呈现给用户。
这两个方面都涉及到编写代码的工做,这才是咱们编码的逻辑所在。
接下来的问题就是,windows感知到用户的输入好理解,那么如何理解windows感知到应用程序的存在呢?仍是以word为例
桌面程序设计已通过时了,还有没有必要学习MFC?
打个比方,就像一所学校,每个学员都有一个代号供学校管理调度,要求你听课,考试。有了hwnd这个概念,咱们就知道了,一样,windows操做系统须要显示,销毁这个窗体,都须要经过hwnd来操做。咱们编程的时候,就能够把本身须要操做的hwnd给windows操做系统,让windows操做系统实现咱们的目的。很显然,一个hwnd是一个窗口的表示,一样的,呈现一个窗口确定须要一套复杂的结构,就比如一个在学校的学生,有学号,有出生年年月,有性别,有专业,各类各样的份量信息。一个窗口结构,确定也是一个复杂的份量组合。对应到语言层面,必定是一个C语言的struct的结构。
C语言是开发操做系统的核心语言,很显然,Windows API是面向C语言风格的。你们都知道C++是C语言的超集,微软为了方便当时的开发人员将已经存在的C语言开发方式,封装成了一套类库,这个就是MFC的由来,咱们能够认为MFC是Windows C++的API。因而,这个就带来了一个新的问题:如何用C++的语义来替代C风格的开发方式。
最直接的方式就是创建面向对象的语义到实际开发概念的映射,实质今日,许多老的软件须要维护的工做,依然会从msdn中查找mfc的类结构,其中最重要的一个结构就是CWnd,这个又称为窗口类,咱们来看下微软是怎么作的。
class CWnd :public CCmdTarget {
DELCARE_DYNCREATE(CWnd)
public:
CWnd();
virtual ~CWnd();html

HWND m_hWnd;
operator HWND() const { return m_hWnd; }
HWND GetSafeHwnd() { return this == NULL ? NULL : m_hWnd; }

//窗口句柄映射
static CWnd* FromeHandle(HWND hWnd);
static CWnd* FormHandlePermanet(HWND hWnd);
BOOL Attach(HWND hWndNew);
HWND Detach();

…}
在C++的语义看来,用来交互的必定是一系列的对象,这些对象与对象之间的交互运动完成软件的工做过程。好比咱们作这样一个想象,图示中是内存中已经存在的一系列对象,这些对象之间相互调用,只要合理安排好这些调用的前后秩序,同时这些对象的数据进行加工处理,获得结果就是这个软件系统运行过程。
桌面程序设计已通过时了,还有没有必要学习MFC?python

借助这样的思想,微软在改造C语言的编程风格的时候,他就要考虑概念的转移,之前,程序原只须要操做hwnd就能够直接和操做系统交互,如今则否则,首先,要刻画一个c++的观念与hwnd对应。这个观念的就是CWnd类设计的初衷。CWnd是批量制造窗体对象的类。他能够批量的new 出一堆窗体对象来。
首先,CWnd对象就必须有Hwnd,这个就是
桌面程序设计已通过时了,还有没有必要学习MFC?
设计的由来。
那么,这些函数又是什么设计语义呢?
桌面程序设计已通过时了,还有没有必要学习MFC?
这个就要谈MFC的体系了。
咱们首先看下拥有了mfc以后,应用程序与操做系统的交互发生了什么样的变化:
桌面程序设计已通过时了,还有没有必要学习MFC?
在没有MFC的时候,全部的应用程序的消息都是直接和windows系统打交道。而MFC应用程序则否则,它像一个楔子同样加载了应用程序与操做系统之间。若是咱们写一个mfc的word,全部的windows消息的截获和感知,都是经过mfc来完成的。这就好像之前你能够直接和老板对话,而如今你的全部的请求和应答都只能委托给mfc来操做。
有了这个概念,再理解上面的代码就顺畅了。之前咱们本身的应用程序要提请windows操做系统操做,直接访问hwnd就能够了。可是如今咱们按照c++语法,咱们用的是Cwnd对象。这个CWnd是一个C++对象,并且是MFC创造出来的c++对象,并非windows的对象。因此,MFC有责任管理好这个对象,这个对象的出生与消亡都跟随的是C++语义。所以,当咱们须要一个表达一个窗体的概念的时候,咱们很天然的就会new一个Cwnd的对象出来。可是,这个CWnd对象是有风险的——若是这个CWnd对象先于windows的窗体出现怎么办?(CWnd对象的内存已经构建好了,可是hwnd还为空,因此它的m_hWnd为空)。一样的CWnd对象概念的出现将windows窗体的hWnd概念和CWnd的概念进行了剥离,那么从理论上讲CWnd对象能够结合任意的hWnd对象。(只要将m_hWnd赋予不一样的值就能够了)。
这又是MFC的一个高超之处,就是要将hWnd和CWnd进行观念解耦,当应用程序须要用CWnd对象的观念表达Windows窗体的时候,用参数传入就能够了。以BOOL Attach(HWND hWndNew);为例,程序开发人员大能够将一个已经存在的windows窗体的hwnd传给当前的CWnd对象,经过attch方法,灵活的将windows窗体附着在Cwnd这个C++对象上。这种设计技巧是十分精妙的,既能够在不变动已有系统的状况下,灵活的用C++的方法进行开发。c++

http://edu.51cto.com/course/13746.html
桌面程序设计已通过时了,还有没有必要学习MFC?程序员

相关文章
相关标签/搜索