`
weihe6666
  • 浏览: 441727 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

MFC-原理分析

    博客分类:
  • MFC
mfc 
阅读更多
MFC-原理分析


MFC只留出API供我们调用,我们使用其接口比较简单,但其内部封装及其复杂,要想成为真正的MFC高手,还是得对其内部的封装有所了解,下面就以一个简单的例子,作为对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;

/////////////////////////////////////////////////////////////////////////
// CMyApp member functions

BOOL CMyApp::InitInstance ()
{
    m_pMainWnd = new CMainWindow;
    m_pMainWnd->ShowWindow (m_nCmdShow);
    m_pMainWnd->UpdateWindow ();
    return TRUE;
}

/////////////////////////////////////////////////////////////////////////
// CMainWindow message map and member functions

BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd)
    ON_WM_PAINT ()
END_MESSAGE_MAP ()

CMainWindow::CMainWindow ()
{
    Create (NULL, _T ("The Hello Application"));
}

void CMainWindow::OnPaint ()
{
    CPaintDC dc (this);
    
    CRect rect;
    GetClientRect (&rect);

    dc.DrawText (_T ("Hello, MFC"), -1, &rect,
        DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}



这个程序及其简单,就是输出"Hello, MFC"。

一、程序的入口

这个程序怎样运行的呢?它即没有main,也没有winmain,以及其他的函数入口,那么它是如何运行,难道会从天而降一个入口函数?

其实这个程序的入口在这里:

_tWinMain->AfxWinMain

-->int AFXAPI AfxWinMain()//位于:WINMAIN.cpp
{
    CWinApp* pApp=AfxGetApp();//pApp指向CMyWinApp.
    AfxWinInit(...);
    pApp->InitApplication();
    pApp->InitInstance();
    nReturnCode = pApp->Run();
    return 0;
}
其中AfxGetApp();//pApp指向CMyWinApp.就是取得CMyWinApp对象,所以AfxWinMain中的
    pApp->InitApplication();
    pApp->InitInstance();
    nReturnCode = pApp->Run();

就相当与:
    CMyWinApp->InitApplication();
    CMyWinApp->InitInstance();
    nReturnCode = CMyWinApp->Run();

也就是:
    CWinApp->InitApplication();//CMyWinApp并没有改写InitApplication()
    CMyWinApp->InitInstance();//CMyWinApp改写了InitInstance()
    nReturnCode = CWinApp->Run();//CMyWinApp并没有改写Run()

所以其入口函数的调用顺序为:
_tWinMain->AfxWinMain ->    CWinApp->InitApplication();
                            CMyWinApp->InitInstance();
                            CWinApp->Run();

这样便进入到当前程序里。

二、如何产生窗口

BOOL CMyApp::InitInstance ()
{
    m_pMainWnd = new CMainWindow;
    m_pMainWnd->ShowWindow (m_nCmdShow);
    m_pMainWnd->UpdateWindow ();
    return TRUE;
}


1. m_pMainWnd = new CMainWindow;
其中m_pMainWnd 是CWnd对象指针:CWnd* m_pMainWnd;  在这里用 用户自定义窗口CMainWindow初始化,从而调用CMainWindow::CMainWindow() 

CMainWindow::CMainWindow ()
{
    Create (NULL, _T ("The Hello Application"));
}


Create (NULL, _T ("The Hello Application"));用来创建一个窗口。

其声明为:
virtual BOOL Create(
   LPCTSTR lpszClassName,
   LPCTSTR lpszWindowName,
   DWORD dwStyle,
   const RECT& rect,
   CWnd* pParentWnd,
   UINT nID,
   CCreateContext* pContext = NULL
);

2.m_pMainWnd->ShowWindow (m_nCmdShow);

当Create (NULL, _T ("The Hello Application"));完成后,程序又回到m_pMainWnd->ShowWindow (m_nCmdShow);来显示窗口。

3.m_pMainWnd->UpdateWindow ();

m_pMainWnd->ShowWindow (m_nCmdShow);来显示窗口后调用m_pMainWnd->UpdateWindow ();来更新窗口。

三、消息的传递

窗口创建后如何发送消息,使得响应消息的函数得以调用,本例中响应消息的函数是OnPaint ()用来在窗口中显示"Hello, MFC"字符,那么这个消息如何传递?

在调用m_pMainWnd->UpdateWindow ()时会发送WM_PAINT消息,此消息有谁获得,又是怎样发送出去的?

MFC程序和SDK程序一样,有一个GetMessage/DispatchMessage循环,用来获得消息和发送消息。而且每一个窗口都有一个窗口函数,并以某种方式进行消息的判断和响应。

当m_pMainWnd->UpdateWindow ()发送WM_PAINT消息后,CWinApp->Run();用循环判断来接受消息,并DispatchMessage发送出去。

四、MessageMap消息映射图及其消息响应机制

当CWinApp->Run();把接受到的消息发送出去后,是如何找到相应的响应函数,这就用到了MessageMap消息映射图。

DECLARE_MESSAGE_MAP ()
BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd)
    ON_WM_PAINT ()
END_MESSAGE_MAP ()
afx_msg void OnMyPaint ();


这些宏构成了复杂的消息映射网。

CWinApp->Run()把接受到的消息发送到CWnd::DefWindowProc中,然后CWnd::DefWindowProc将绕行消息映射表MessageMap,绕行的过程中,发现吻合的函数,于是调用相应的函数。此函数是通过BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间的宏建立的连接。

这个例子中m_pMainWnd->UpdateWindow ()发送WM_PAINT消息,而CWinApp->Run()把接受到的消息发送到CWnd::DefWindowProc中,在映射表中会有
#define ON_WM_PAINT() \
{ WM_PAINT, 0, 0, 0, AfxSig_vv, \
(AFX_PMSG)(AFX_PMSGW) \
(static_cast< void (AFX_MSG_CALL CWnd::*)(void) > ( &ThisClass :: OnPaint)) },

会把WM_PAINT和&ThisClass :: OnPaint联系在一起,那么void CMainWindow::OnPaint ()就会被调用。

分享到:
评论

相关推荐

    mfc-一些mfc实例代码-mfc示例-sample.zip

    这些代码样本可以帮助我们深入理解MFC的工作原理和使用方法,包括如何创建窗口、添加控件、处理消息以及实现特定功能等。通过分析和学习这些实例,我们可以更好地掌握MFC编程技术。 1. **MFC应用程序框架**:MFC...

    MFC内部原理深度分析

    MFC内部原理深度分析旨在帮助开发者深入理解MFC的工作机制,包括其类结构、消息处理机制、对象创建与管理以及事件驱动编程模式。 **一、MFC的类结构** MFC将Windows API中的许多概念封装为C++类,如CWinApp、CWnd、...

    兄弟喷墨机通用维修手册 MFC

    3. **操作原理**:概述了扫描、打印等核心组件的工作原理,以及传感器、控制器等电子部件的作用,帮助理解设备的基本运行机制。 4. **传送残留数据**:指导如何在打印机故障导致无法正常打印接收数据时,通过特定...

    MFC2000-3A-D使用说明书V1.2

    1. **引言**:这部分可能涵盖了装置的基本用途、设计原理和重要性,强调了该说明书的重要性,同时指出此版本的说明书不作为设计依据,产品可能根据实际情况有所更新,最终应以出厂图纸为准。 2. **装置硬件构成**:...

    MFC-PING简单代码

    通过分析这个"MFC-PING简单代码",你可以学习到如何在MFC环境中集成网络功能,这对于开发需要网络通信的桌面应用非常有价值。不过,实际的代码实现会涉及具体的细节,例如具体的API调用、数据结构的定义和使用,这些...

    MFC-application.rar_MFC CApplication_c++ mfc application

    - 书籍:如《Programming Windows with MFC》等书籍可以帮助深入理解MFC的工作原理。 - 示例代码:通过分析和实践这个"MFC-application.rar"中的代码,可以了解CApplication类在实际应用中的使用。 6. **注意事项...

    MFC-windows.rar_MFC_MFC 对话框

    通过分析这些源代码,可以深入理解MFC的工作原理以及如何在实际项目中应用。 学习MFC对话框的开发,不仅可以提升Windows程序设计能力,还能够理解控件事件处理、消息映射等核心概念。MFC的对话框支持包括但不限于...

    还是MFC-cdialog计算器—我又修改了下

    本文将围绕“MFC-CDialog计算器”这一主题,探讨其设计原理、实现细节以及可能的改进方法。 首先,我们来看“MFC-CDialog计算器”的核心——CDialog类。CDialog是MFC中用于构建对话框的基类,它继承自CWnd,提供了...

    vc2008-MFC-计算器

    4. **源码分析**:像“vc2008-MFC-计算器”这样的实际项目,通过阅读和修改代码,能更好地理解MFC的工作原理。 通过上述步骤,不仅可以修复下载资源的问题,还能增强对MFC和Windows编程的理解,为以后的开发工作...

    MFC-sample.rar_MFC

    学习MFC的过程中,你需要掌握如何创建MFC应用程序,理解文档/视图架构的工作原理,熟练使用控件创建用户界面,处理窗口消息,以及如何利用MFC进行数据库和网络编程。此外,实践是提高MFC技能的关键,通过分析和修改...

    MFC-LantCtrl.zip

    通过阅读和分析源代码,可以深入理解MFC的事件处理机制,滚动条控件的工作原理,以及如何根据需求自定义控件的行为。同时,这也体现了开发者对用户体验的关注,通过优化滚动条行为,使得应用更加人性化。

    LL(1)文法的实现-mfc-编译原理学习

    LL1文法分析器 模拟LL1文法分析过程 实现功能:1.文法的输入、表示及转化模块。2.求每个非终结符FIRST 集FOLLOW集和SELECT集模块。3.预测分析表的构建模块。4.文法的检验及消除左公因子和左递归模块。5.对输入终结符...

    深入浅出MFC---侯捷

    **深入浅出MFC——侯捷**...通过阅读《深入浅出MFC》,开发者不仅可以掌握MFC的基本用法,还能深入理解Windows程序设计的原理,提升自己的编程能力。无论你是初学者还是有经验的开发者,这本书都能为你提供宝贵的指导。

    Visual C++权威剖析:MFC的原理、机制与开发实例.pdf

    《Visual C++权威剖析:MFC的原理、机制与开发实例》是一本深入讲解MFC(Microsoft Foundation Classes,微软基础类库)的专业技术书籍,由辛长安和王颜国编著,由清华大学出版社出版。本书主要针对已经具备一定...

    OPENCV-MFC-LBP

    总之,"OPENCV-MFC-LBP"项目为开发者提供了一个在Windows环境下利用OpenCV和MFC实现LBP算法的示例,这有助于理解LBP算法的原理,以及如何在实际项目中整合这两种强大的工具。通过深入研究这个项目,开发者可以提升在...

    基于微软MFC框架的BOTDR上位机软件源码botdr-mfc-master.zip

    学习这个源码包,开发者不仅可以深入理解MFC框架的使用,还能了解到BOTDR系统的工作原理和实现细节。对于希望在光纤测试领域开发应用的工程师来说,这是一个宝贵的参考资料。通过阅读和分析代码,可以提升对MFC以及...

    vc多线程-mfc-大家可以看看

    在VC++开发环境中,MFC...理解`CWinThread`的工作原理,以及如何利用MFC提供的同步和通信机制,是开发多线程MFC程序的关键。在实际项目中,根据需求选择合适的线程模型和同步策略,可以显著提升程序的性能和用户体验。

    深入浅出mfc-笔记

    ### 深入浅出MFC—笔记关键知识点解析 ...通过以上分析可以看出,MFC充分利用了C++的多态性以及其他面向对象特性,为开发者提供了一个高度灵活和可扩展的框架。掌握这些基础知识对于深入理解MFC的工作原理至关重要。

    MFC-MCI简单音乐播放器源码

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库结合MCI( Multimedia Control ...通过阅读和分析代码,你可以了解到如何将MFC的事件处理机制与MCI命令结合起来,实现一个实际的功能性应用。

    mfc-tool

    标题"MFC-Tool"暗示了这是一个与Microsoft Foundation Classes (MFC)相关的工具或库,MFC是微软提供的一套C++...如果你打算使用这个工具,建议首先了解MFC的基本概念和工作原理,然后根据提供的资源逐步学习和实践。

Global site tag (gtag.js) - Google Analytics