c++ - 实现类CContainedWindow的功能而无需父类(super class)或子分类

标签 c++ windows winapi atl

假设您想拥有一个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中是否有任何我可以忽略的东西(例如消息映射宏或其他什么)可以做到这一点,或者使其变得整洁或允许使用单个消息映射。感谢您的指导。

最佳答案

根据Igor的评论,我认为您可以执行以下操作来实现某种“空白”的CContainedWindow:

class CContainedWindowBlank : public CWindowImpl<CContainedWindowBlank>
                            , public CDynamicChain
{
public:
    CContainedWindowBlank(CMessageMap* pObject, DWORD dwMsgMapId = 0)
    {
        SetChainEntry(1, pObject, dwMsgMapId);
    }

    BEGIN_MSG_MAP()
        CHAIN_MSG_MAP_DYNAMIC(1)
    END_MSG_MAP()
};
尽管我不确定如何将其转换为接受诸如CWinTraits之类的模板。如果有人知道该怎么做,我将不胜感激。谢谢。
实际上,我似乎已经实现了模板化版本,尽管我不太确定为什么可以使用它或是否可以对其进行简化:
template <class TBase = CWindow, class TWinTraits = CControlWinTraits>
class CContainedWindowBlankT : public CWindowImpl<CContainedWindowBlankT<TBase, TWinTraits>, TBase, TWinTraits>
                             , public CDynamicChain
{
public:
    CContainedWindowBlankT(CMessageMap* pObject, DWORD dwMsgMapId = 0)
    {
        SetChainEntry(1, pObject, dwMsgMapId);
    }
    BEGIN_MSG_MAP()
        CHAIN_MSG_MAP_DYNAMIC(1)
    END_MSG_MAP()
};

关于c++ - 实现类CContainedWindow的功能而无需父类(super class)或子分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64091839/

相关文章:

c++ - 图片上的文字

c++ - SNMP:无法创建/设置变量,编码错误

c++ - 无法在 Windows 对话框上显示其他 unicode 东亚语言

windows - 从操作系统/应用程序分析 CPU 缓存/内存?

c# - 选择ListView的特定列并在C#.net中的新消息框中打印

excel - 如何处理 VBA 中的 DLL 错误?

c++ - 编织中的降噪算法

c++ - 从动态分配的解引用指针默认初始化非常量引用函数参数是否会造成内存泄漏?

winapi - CCombobox : how to set text color of Editable area text when combobox style is dropdown in win32

c# - 如何在调用方法中定义回调函数?