【发布时间】:2021-01-13 10:13:07
【问题描述】:
假设您想要一个CContainedWindow,但您想从头开始工作——即,您希望它有自己的新消息映射,没有任何超类或子类。因此,换句话说,您希望在单个类声明中方便地使用所有处理程序方法,但您不想处理预定义窗口类的任何特性。有没有一种优雅的方式来实现这一点?我唯一想出的大概是这样的(它是一个嵌套在外部CWindowImpl-派生类中的CWindowImpl-派生类):
class COuterWindow :
public CWindowImpl<COuterWindow>
{
public:
COuterWindow() : m_wndInner(this)
{
}
BEGIN_MSG_MAP(COuterWindow)
// ...
END_MSG_MAP()
private:
class CInnerWindow :
public CWindowImpl<CInnerWindow>
{
public:
CInnerWindow(COuterWindow* pwndOuter) : m_pwndOuter(pwndOuter)
{
}
private:
COuterWindow* m_pwndOuter;
BEGIN_MSG_MAP(CInnerWindow)
MESSAGE_HANDLER(WM_PAINT, m_pwndOuter->OnInnerPaint)
// ...
END_MSG_MAP()
};
LRESULT OnInnerPaint(UINT, WPARAM, LPARAM, BOOL&);
CInnerWindow m_wndInner;
};
这可行,但我想知道在我忽略的 ATL 中是否有任何东西(如消息映射宏或其他东西)可以完成此操作或使其更整洁或允许使用单个消息映射。感谢您的指导。
【问题讨论】:
-
您可能正在寻找
CHAIN_MSG_MAP_DYNAMIC和CDynamicChain。它允许您将所有(或大部分)消息从CInnerWindow的实例重定向到COuterWindow实例中的备用消息映射。 -
谢谢,但我从文档中得出的结论是否正确,您只能重定向到默认消息映射? docs.microsoft.com/en-us/cpp/atl/reference/…
-
不,
CDynamicChain::SetChainEntry采用 alt 消息映射的 ID。 -
哦,太棒了。我没看到。非常感谢。
-
如果您想添加您的评论作为答案,我会接受。