1

当您使用 WTL 时,您可以自由复制表示内置对象的控件:

// Notice that CWindow is passed by _copy_, because it only wraps the HWND
int OnNotifyFormat(CWindow wndFrom, int nCommand) { ... }

现在,如果我想制作自己的控件,很容易说:

template <class T, class TBase = CWindow, class TWinTraits = CControlWinTraits>
struct CMyControlImpl: public CWindowImpl<T, TBase, TWinTraits>
{
    std::vector<int> internal_info;

    BEGIN_MSG_MAP_EX(...)
        ...
    END_MSG_MAP()
};

struct CMyControl : public CMyControlImpl<CMyControl>
{
    DECLARE_WND_CLASS_EX(TEXT("MyControl"), 0, COLOR_WINDOW)
};

但现在的问题是我不能简单地说:

void OnFooHappened(CMyControl control)
{
}

因为CMyControl它不仅仅是一个句柄——它包含数据本身!

关于这种复制行为,制作与内置 ATL/WTL 类一致的控件类的正确方法是什么?

4

1 回答 1

3

您在 WTL 中有一些自定义控件,位于\Include\atlctrlx.h

///////////////////////////////////////////////////////////////////////////////
// Classes in this file:
//
// CBitmapButtonImpl<T, TBase, TWinTraits>
// CBitmapButton
// CCheckListViewCtrlImpl<T, TBase, TWinTraits>
// CCheckListViewCtrl
// CHyperLinkImpl<T, TBase, TWinTraits>
// CHyperLink

除此之外,您还可以在http://viksoe.dk找到正确的自定义 WTL 控件。

控件的“可复制性”基于这样一个事实,即您可以通过句柄使用标准控件HWND,并且您可以轻松地复制、附加、分离等这个句柄,并且虽然它是有效的,但整个控件是好的。包装类很薄,只有HWND成员变量。

另一方面,正如您所注意到的,自定义控件具有附加信息,您无法轻松复制它们。您仍然可以使用控件动态分配/释放这些附加信息,您将实现附加控件特定的窗口消息和通知,然后您可以创建一个瘦包装类,将方法转换为消息,将它们发送到真正的控件,它反过来会处理它们,特别是。通过将带有参数的消息转换回真实方法。这使您可以复制薄包装类,但控件本身更加复杂和麻烦(您通常不需要那样做)。

于 2012-08-07T06:22:28.813 回答