有没有办法获得控件在MFC应用程序中映射到的处理函数?

时间:2014-12-23 14:41:02

标签: c++ mfc onclick message-handlers

假设我有一个带有按钮控件的MFC应用程序。有没有办法检索OON_BN_CLICKED将其映射到的函数?我知道CWnd有一个GetDlgItem函数,它将返回一个指向控件的指针。如果我有这个指针,有没有办法获得控件映射到的函数?

我找到了一个方法,我相信可以用来向Dialog项目或控件发送消息:CWnd :: SendDlgItemMessage(http://msdn.microsoft.com/en-us/library/e2a6czt1.aspx),但Id'希望能够知道可能的消息。

1 个答案:

答案 0 :(得分:1)

在大多数情况下,您知道可以发送到窗口的消息。我强烈怀疑你可能没有为你的任务采取正确的道路。你想要实现什么目标?即你问的是不常见的,真正的任务最有可能通过其他方式解决。

反正。如果你有一个指向某个MFC CWnd派生对象的指针,它仍然可以反向工程'它是由CWnd *指向的类中定义的MFC消息处理程序。 MFC使用BEGIM_MESSAGE_MAP / END_MESSAGE_MAP定义映射中的所有消息处理程序。这些宏实际上做的是,它们定义了一个名为GetMessageMap()的虚函数和一个包含描述消息映射的结构的数据数组。因此,您可以使用wnd-> GetMessageMap(),然后迭代映射的消息处理程序。每个条目都包含有关消息处理程序和映射函数的信息。请注意,GetMessageMap是受保护的函数,因此要从外部访问它,您需要一个包装器。像这样:

struct Accessor : public CWnd
{
    // overwrite protected
    virtual const AFX_MSGMAP* GetMessageMap() const { return CWnd::GetMessageMap(); }
};

Accessor* msg_map_access = (Accessor*) window;
const AFX_MSGMAP* msg_map = msg_map_access->GetMessageMap();

const AFX_MSGMAP_ENTRY* entry = msg_map->lpEntries;
while (entry->nSig != AfxSig_end)
{
    /// do something with the entries
}

同样,这不是常见的做法;通常,你永远不会这样做。所以很高兴听到你需要这个的动机。