有没有办法获取控件在 MFC 应用程序中映射到的处理程序函数
Is there a way to get the handler function that a control is mapped to in an MFC application?
>假设我有一个带有按钮控件的MFC应用程序。有没有办法检索OON_BN_CLICKED映射到的函数?我知道CWnd有一个GetDlgItem函数,它将返回指向控件的指针。如果我有这个指针,有没有办法获取控件映射到的函数?
我找到了一种我认为可用于将消息发送到对话框项或控件的方法:CWnd::SendDlgItemMessage (http://msdn.microsoft.com/en-us/library/e2a6czt1.aspx),但 Id' 希望能够知道可能的消息。
在大多数情况下,您知道可以发送到窗口的消息。我强烈怀疑你可能没有为你的任务走正确的道路。你到底想完成什么?也就是说,你问的并不常见,真正的任务很可能可以通过其他方式解决。
无论如何。如果您有指向某个 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
}
同样,这不是常见的做法;通常,你永远不会这样做。因此,很高兴听到您需要这样做的动机。
相关文章:
- 错误处理.将系统错误代码映射到泛型
- C++在一个映射中存储不同的指针类型(并处理销毁)
- C++预处理会生成变量成员、资源库和映射
- C 正确的方法来初始化和处理映射指针
- 处理对存储在私有映射中的值的封装访问的标准方法,而不破坏C++中的抽象
- 如何自动将处理程序添加到全局映射
- 有没有办法在 MFC 中在运行时禁用消息映射处理程序
- c++处理结构的映射
- C++映射的指针在退出时自动释放,如何处理删除
- 如何使用move构造函数正确处理shared_ptr的映射
- 使用c++减少两个映射的处理时间
- 多重映射如何在内部处理重复键
- 有没有办法获取控件在 MFC 应用程序中映射到的处理程序函数
- 您如何处理使用 36 位映射的 IO
- 在c++中使用映射器处理派生类的创建
- 无法遍历模板映射.如何处理这个错误
- Boost::range用于处理容器的内容,并将映射中的值管道到下一个进程
- 如何处理带有底层排序向量的映射中的const值
- std::映射<>或std::vector<>在处理大型标志集时
- OpenMP对带有映射的循环进行并行处理