gpt4 book ai didi

c++ - 如何使用 ATL/WTL 制作您自己的类原生(可复制)控件?

转载 作者:行者123 更新时间:2023-11-30 03:00:35 25 4
gpt4 key购买 nike

当您使用 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 类一致的控件类的正确方法是什么?

最佳答案

在 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 成员变量。

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

关于c++ - 如何使用 ATL/WTL 制作您自己的类原生(可复制)控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11840301/

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