几何尺寸与公差论坛

 找回密码
 注册
查看: 2047|回复: 1

【转帖】深入浅出mfc第九章!on_wm_create()

[复制链接]
发表于 2007-12-10 15:09:37 | 显示全部楼层 |阅读模式
#define   ON_WM_CREATE()   {   WM_CREATE,   0,   0,   0,   AfxSig_is,    (AFX_PMSG)(AFX_PMSGW)(int   (AFX_MSG_CALL    CWnd::*)(LPCREATESTRUCT))&OnCreate   },   
   如果我的类里映射了WM_CREATE消息,也就是说,OnCreate   在我的类里,与    CWnd::有什么关系呢?我知道这些代码是对的,因为它是MFC的源码,我也知道这是类型转换,可是有什么道理?到底是怎么转换的,与CWnd::*有什么关系?   
  请一定指教!拜托!
 楼主| 发表于 2007-12-10 15:10:16 | 显示全部楼层

回复: 【转帖】深入浅出mfc第九章!on_wm_create()

1.AFX_MSG_CALL     定义在   <afxwin.h>   
  其实什么都不是,占位符(place-holder)   
  #ifndef   AFX_MSG_CALL   
  #define   AFX_MSG_CALL   
  #endif   
   
  如果需要有所改变,只要改变此宏,不用在源程序所有定义的地方改,类似的还有:afx_msg,AFX_DATADEF等等   
     
  2、AfxSig_is   定义在<afxmsg_.h>   
   是个枚举常量,AfxSig_XXX,其中XXX表示返回及参数类型(i=>int,s=>string)   
   
   3、AFX_PMSG,AFX_PMSGW   定义在<afxwin.h>   
  声明几种函数指针类型   
  typedef    void   (AFX_MSG_CALL   CCmdTarget::*AFX_PMSG)(void);   
  typedef   void    (AFX_MSG_CALL   CWnd::*AFX_PMSGW)(void);   
  如果去掉无用的占位符:   
  typedef    void   (CCmdTarget::*   AFX_PMSG)   (void);//指向CCmdTarget类成员函数的指针   
   typedef   void   (CWnd::*   AFX_PMSGW)   (void);   
   
   因为消息映射机制是类CCmdTarget实现的(这个宏应该是给CWnd类定义的),所以会用基类的实现。   
   
   firehorizon(ldh)   
  int   (AFX_MSG_CALL    CWnd::*)(LPCREATESTRUCT))&OnCreate将指向OnCreate()的函数指针转换为什么类型?为什么要加CWnd::*?   
  指向函数的指针定义语法:   
  [返回类型]   (<指针类型>   *   <指针变量名>)   (参数表)   
  int   (int   *   pfn)   (void);       //一般的函数指针   
  int    (classname::*   pmfn)(void);       //指向成员函数的指针
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-5-10 18:52 , Processed in 0.037218 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表