通过父类对象指针发送子类自定义消息

本文探讨了MFC中通过父类对象指针向子类发送自定义消息的过程,并解析了其背后的消息映射机制,揭示了如何利用虚函数GetMessageMap实现子类消息处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       最近在编写MFC时,遇到一个情况是,当我要向一个自己定义的Dialog发送消息时只有CDialog对象的指针,而没有我自己定义的CMyDialog(派生自CDialog类)的对象指针。而我要发送的消息却是在CMyDialog中自定义的消息。这时我产生了疑问,通过父类对象的指针发送在子类中定义的自定义消息,能否成功?

       进过实践,答案是可以的。具体问题可以用下面代码简要说明。

#define UM_SHOW     WM_USER+100

class CMyDialog : public CDialog

{

    DECLARE_DYNAMIC(CLogonDialog)

 

public:

    CLogonDialog(CWnd* pParent = NULL);   // 标准构造函数

 

    virtual ~CLogonDialog();

 

// 对话框数据

    enum { IDD = IDD_UserLogon };

 

protected:

    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

 

    DECLARE_MESSAGE_MAP()  

public:

   

    afx_msg LRESULT OnShow(WPARAM wParam, LPARAM lParam);

};

 

在另一个类中MyUser类中出现这样的一行调用:

CDialog* m_pMyDialog;

……    //实现将m_pMyDialog 指向 CMyDialog的对象

m_pMyDialog ->PostMessage(UM_SHOW,0,0);            //发送子类可以处理的消息

问题是MFC如何知道能够调用子类的消息处理函数?

       这里让我想到了MFC的消息处理机制。在该消息处理机制中,每一个类有一个消息和消息处理函数对应的表。然后再通过宏将这些表串起来,这样只需要查表就可以知道这个消息该给谁处理。

       在对这张表访问时,需要调用一个函数才能返回这样表的地址,这个函数就是:

       virtual AFX_MSGMAP* GetMessageMap() const;

       这个函数可以在《深入浅出MFC》的P134找到。

       现在注意一个特别关键的地方这个函数是virtual关键字修饰,这样刚才的问题就很好解释了。这是个虚函数,自然通过父类对象的指针发送的消息

m_pMyDialog ->PostMessage(UM_SHOW,0,0);         //发送子类可以处理的消息 
       MFC
中会调用到子类的对应处理函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值