其实,所以的windows开发的语言,最终都是调用windows API.要成为真正的编程高手,必须熟练掌握API。MFC就是对API的封装,全面深入了解MFC是如何调用API来产生各种各样的类的,对我们学习API很有帮助。为此,让我们大家一起来吧,共同深入研究MFC。首先,我原来是学C的,对C++的一些语法有些不熟悉,例如宏的定义。
下面是MFC组织消息的宏代码,看得不是很明白,请大家帮研究解释一下:
/////////////////////////////////////////////////////////////////////////////
// Window message map handlingstruct AFX_MSGMAP_ENTRY;       // declared below after CWndstruct AFX_MSGMAP
{
#ifdef _AFXDLL
const AFX_MSGMAP* (PASCAL* pfnGetBaseMap)();
#else
const AFX_MSGMAP* pBaseMap;
#endif
const AFX_MSGMAP_ENTRY* lpEntries;
};#ifdef _AFXDLL
#define DECLARE_MESSAGE_MAP() \
private: \
static const AFX_MSGMAP_ENTRY _messageEntries[]; \
protected: \
static AFX_DATA const AFX_MSGMAP messageMap; \
static const AFX_MSGMAP* PASCAL _GetBaseMessageMap(); \
virtual const AFX_MSGMAP* GetMessageMap() const; \#else
#define DECLARE_MESSAGE_MAP() \
private: \
static const AFX_MSGMAP_ENTRY _messageEntries[]; \
protected: \
static AFX_DATA const AFX_MSGMAP messageMap; \
virtual const AFX_MSGMAP* GetMessageMap() const; \#endif#ifdef _AFXDLL
#define BEGIN_MESSAGE_MAP(theClass, baseClass) \
const AFX_MSGMAP* PASCAL theClass::_GetBaseMessageMap() \
{ return &baseClass::messageMap; } \
const AFX_MSGMAP* theClass::GetMessageMap() const \
{ return &theClass::messageMap; } \
AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass::messageMap = \
{ &theClass::_GetBaseMessageMap, &theClass::_messageEntries[0] }; \
AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
{ \#else
#define BEGIN_MESSAGE_MAP(theClass, baseClass) \
const AFX_MSGMAP* theClass::GetMessageMap() const \
{ return &theClass::messageMap; } \
AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass::messageMap = \
{ &baseClass::messageMap, &theClass::_messageEntries[0] }; \
AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
{ \#endif#define END_MESSAGE_MAP() \
{0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } \
}; \// Message map signature values and macros in separate header

解决方案 »

  1.   

    尤其是这一句,是什么意思呢?在C中,[]表示一个数组,这是否也与数组有关?
    AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
    { \
      

  2.   

    下面是基类CObject的头文件代码:
    /////////////////////////////////////////////////////////////////////////////
    // class CObject is the root of all compliant objects#ifdef _AFXDLL
    class CObject
    #else
    class AFX_NOVTABLE CObject
    #endif
    {
    public:// Object model (types, destruction, allocation)
    virtual CRuntimeClass* GetRuntimeClass() const;
    virtual ~CObject();  // virtual destructors are necessary // Diagnostic allocations
    void* PASCAL operator new(size_t nSize);
    void* PASCAL operator new(size_t, void* p);
    void PASCAL operator delete(void* p);
    #if _MSC_VER >= 1200
    void PASCAL operator delete(void* p, void* pPlace);
    #endif#if defined(_DEBUG) && !defined(_AFX_NO_DEBUG_CRT)
    // for file name/line number tracking using DEBUG_NEW
    void* PASCAL operator new(size_t nSize, LPCSTR lpszFileName, int nLine);
    #if _MSC_VER >= 1200
    void PASCAL operator delete(void *p, LPCSTR lpszFileName, int nLine);
    #endif
    #endif // Disable the copy constructor and assignment by default so you will get
    //   compiler errors instead of unexpected behaviour if you pass objects
    //   by value or assign objects.
    protected:
    CObject();
    private:
    CObject(const CObject& objectSrc);              // no implementation
    void operator=(const CObject& objectSrc);       // no implementation// Attributes
    public:
    BOOL IsSerializable() const;
    BOOL IsKindOf(const CRuntimeClass* pClass) const;// Overridables
    virtual void Serialize(CArchive& ar);#if defined(_DEBUG) || defined(_AFXDLL)
    // Diagnostic Support
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
    #endif// Implementation
    public:
    static const AFX_DATA CRuntimeClass classCObject;
    #ifdef _AFXDLL
    static CRuntimeClass* PASCAL _GetBaseClass();
    #endif
    };大家分析一下!
      

  3.   

    http://blog.csdn.net/jiangsheng/archive/2004/01/05/3797.aspx
      

  4.   

    CObject类的CPP代码在哪里,没法找到,有谁能告诉我?
      

  5.   

    afx.h
    简单点的办法,在工程里随便什么地方写个CObject 然后goto defination
      

  6.   

    AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = ...
    ===================================================================
    这是一个类静态数组,在.h文件中是否声明一下。所以一定要定义它的大小的。
    其实楼主这个就是MFC的消息映射结构。
      

  7.   

    AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = ...
    ===================================================================
    这是一个类静态数组,在.h文件中是否声明一下。所以一定要定义它的大小的。
    其实楼主这个就是MFC的消息映射结构
    ————————————————————————————————
    我知道它是消息映射结构,但好象并没有定义它的大小呀。因为在用BEGIN_MESSAGE_MAP(CLgxgridForMoreDocView, CView)
    ON_WM_KEYDOWN()
    ON_WM_CREATE()
    ON_WM_PAINT()
    ON_WM_SIZE()
             //并不知道用户要在这里添加多少条消息!
    END_MESSAGE_MAP()声明消息映射时并不知道会添加多少条消息!
    如果我们把这段宏展开,就成了下面的:
    AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = 

               ON_WM_KEYDOWN()
      ON_WM_CREATE()
      ON_WM_PAINT()
      ON_WM_SIZE()
               {0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } 
    }; 我弄不明白它们是如何映射成:
    switch(MESSAGE)
    {
     case xxx:
        //处理函数xxx
     case yyy:
        //处理函数yyy
     }
    这样的结构的。我们知道,消息最终是这样处理的,尽管MFC把它封装了。