gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:23:02 25 4
gpt4 key购买 nike

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

我找到了一种我认为可以用来向对话框项或控件发送消息的方法:CWnd::SendDlgItemMessage ( http://msdn.microsoft.com/en-us/library/e2a6czt1.aspx ),但我希望能够知道可能的消息。

最佳答案

在大多数情况下,您知道可以发送到窗口的消息。我强烈怀疑您可能没有为您的任务选择正确的道路。你到底想完成什么? IE。你问的是不常见的,真正的任务很可能可以通过其他方式解决。

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

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
}

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

关于c++ - 有没有办法在 MFC 应用程序中获取控件映射到的处理函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27622545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com