标签:相互 而且 原理 变化 求和 技巧 att 应用程序 开发人员
“现在已经是人工智能、大数据的时代,云+端才是王道,桌面程序设计已经过时了,还有没有必要学习MFC?”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++的语义看来,用来交互的一定是一系列的对象,这些对象与对象之间的交互运动完成软件的工作过程。比如我们做这样一个想象,图示中是内存中已经存在的一系列对象,这些对象之间相互调用,只要合理安排好这些调用的先后秩序,同时这些对象的数据进行加工处理,得到结果就是这个软件系统运行过程。
借助这样的思想,微软在改造C语言的编程风格的时候,他就要考虑概念的转移,以前,程序原只需要操作hwnd就可以直接和操作系统交互,现在则不然,首先,要刻画一个c++的观念与hwnd对应。这个观念的就是CWnd类设计的初衷。CWnd是批量制造窗体对象的类。他可以批量的new 出一堆窗体对象来。
首先,CWnd对象就必须有Hwnd,这个就是
设计的由来。
那么,这些函数又是什么设计语义呢?
这个就要谈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++的方法进行开发。
标签:相互 而且 原理 变化 求和 技巧 att 应用程序 开发人员
原文地址:http://blog.51cto.com/xiacaojun/2314953