最近那么长时间都没写博文。感觉经常写博文是好事。工作的时候项目是用MFC做的。百度了下说这个框架已经过时了。但是工作需要又不得不看,所以现在就之前看的一篇关于设备上下文的文章转载下

    

MFC中的DC、CDC、HDC、句柄、设备上下文究竟是什么意思? 

    在MFC程序中,我们并不经常直接调用Windows API,而是从MFC类创建对象并调用属于这些对象的成员函数.也就是说MFC封装了Windows API 你说你喜欢C++而MFC换一种说法就是一个用C++写的一个函数库 然后你来调用 只不过这个类不是你写的

       MFC提供数百个类,最重要的、也是编写任何VC++应用程序都必不可少的两个类CWinApp和CFrameWnd,这两个类是编写复杂庞大应用程序的基石。

1>封装特性:构成MFC框架的是MFC类库而MFC类库又是C++的一个类库。这些类封装WIN32应用程序编程接口,OLE(Object Link Embed 对象链接嵌入)特性,ODBC和DAO数据访问的功能。

2>继承特性:MFC抽象出了众多类的共同特性,并设计出一些基类作为实现其他类的基础,这些类中最重要的类是CObject类和CCmdTarget类,程序员可以从适当的MFC类中派生出自己的类,实现特定的功能达到编程的目的。

3>虚拟和消息映射:MFC是以C++为基础,当然支持虚函数,但作为一个编程框架必须要解决的是效率问题:如果MFC仅仅通过虚函数来支持动态约束必然会产生大量的虚函数表这样编程框架过于臃肿而且消耗更多的内存。但是MFC建立了消息映射机制这样降低了内存的使用却大大提高了效率

消息映射是一个将消息和成员函数相互关联的表,当应用程序的框架窗口接收到一个消息时,MFC将搜索该窗口的消息映射,如果存在一个处理消息的处理程序,那么就调用该处理程序.

它通过宏来实现消息到成员函数的映射,而且这些函数不必是虚拟的成员函数,这样不需要为消息映射函数生成一个很大的虚拟函数表(V表),节省内存。 

MFC消息映射机制:

将消息与消息处理函数联系起来,形成一一对应的机制。

消息映射宏

声明: DECLARE_MESSAGE_MAP 

定义:

        BEGIN_MESSAGE_MAP 

   ON_COMMAND

   ON_CONTROL

   ON_MESSAGE 

       END_MESSAGE_MAP

MFC主要组成部分:类、宏和全局函数。

类是MFC中最主要的内容。MFC类是以层次结构方式组织起来的。MFC中的类分成两部分,除了一些辅助类,大多数的MFC类是直接或间接从根类CObject派生而来。

MFC宏主要功能:消息映射、运行时对象类型服务、诊断服务、异常处理。 

MFC约定:全局函数以“Afx”为前缀,全局变量以“afx”为前缀

MFC类的层次关系

CObject项目类)->CCmdTarget(消息响应类)->

{

CWinThread(线程类)->CWinApp(Window应用程序类)

CDocument(文档类)

CWnd(窗体类)->[

              CFrameWnd(框架类)

              CView(视图类)

              ]

}

CObject类由于MFC中大部分类是从CObject类继承而来的,CObject类描述了几乎所有的MFC类的一些公共特性,CObject类为程序员提供了对象诊断、运行时类型识别和序列化等功能。

CCmdTarget类由CObject类直接派生而来,它负责将消息发送到能够响应这些消息的对象。它是所有能进行消息映射的MFC类的基类。

CWinApp类在任何MFC应用程序中有且仅有一个CWinApp派生类的对象,它代表了程序中运行的主线程,也代表了应用程序本身。 CWinApp类取代了WinMain()主函数在SDK应用程序中的地位。传统SDK应用程序WinMain()函数完成的工作。现在由类CWinApp的InitApplication(),InitInstance()和Run()三个成员函数承担。

CWnd类由CCmdTarget类直接派生而来,该类及其派生类的实例是一个窗口。CWnd类代表了MFC中最基本的GUI对象,它是一个功能最完善、成员函数最多的MFC类。

CFrameWnd类是CWnd类的派生类,主要用来掌管一个窗口,它取代了SDK应用程序中窗口函数WndProc()的地位。CFrameWnd类的对象是一个框架窗口,包括边框、标题栏、菜单、最大化按钮、最小化按钮和一个激活的视图。

CDocument类在应用程序中作为用户文档类的基类,它代表了用户存储或打开的一个文件。

CView类是MFC中一个很基本的类,它作为其它MFC视图类和用户视图派生类的基类。

从API编程到MFC编程的过渡:

WinMain()

{  初始化WNDCLASS

    注册窗体结构 

    创建窗口           ->>>>>>>>应用程序类CWinApp

    显示窗口

    消息循环

WndProc()

{ switch(…)            

           ->>>>>>>>>框架窗口类CFrameWnd

}

MFC Object和Windows Object的对应关系:

描述                 Windows句柄       MFC Object 

窗口                  HWND                    CWnd 

设备上下文        HDC                      CDC 

菜单                   HMENU                CMenu 

笔                       HPEN                   CPen

刷子                   HBRUSH              CBrush

字体                   HFONT                 CFont

位图                    HBITMAP            CBitmap

套接字                SOCKET              CSocket

三、手工创建一个MFC应用程序:

注意:创建MFC程序,要创建一个Win32空项目,并要选择项目属性中的”在共享DLL文件中使用MFC,然后新建我们的文件

例子:在”hello.h”头文件中添写如下代码:

class CMyApp:public CWinApp

{

public:

 virtual BOOL InitInstance();//虚函数

};

class CMainWindow:public CFrameWnd

{

public:

 CMainWindow();

protected:

 afx_msg void OnPaint();

 DECLARE_MESSAGE_MAP();//声明消息映射

};

在”hello.cpp”源文件中添写如下代码:

#include <afxwin.h>

#include “hello.h"

CMyApp myApp;

BOOL CMyApp::InitInstance()

{

 m_pMainWnd = new CMainWindow;

      m_pMainWnd->ShowWindow(m_nCmdShow);

 m_pMainWnd->UpdateWindow();

 return TRUE;

}

BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)

 ON_WM_PAINT()

END_MESSAGE_MAP()