我在一个项目中使用了 ATL 和 WTL 的组合,并从中派生了我自己的类CWindowImpl
,看起来像这样:
class CMyControl : public CWindowImpl<CMyControl>
{
public:
DECLARE_WND_CLASS(_T("MyClassName"))
...
BEGIN_MSG_MAP(CMyControl)
...
END_MSG_MAP()
};
这一切都很好,如果我使用CMyControl::Create
创建控件的实例,然后它在幕后工作得很好,CWindowImpl::Create
函数将注册 Win32 类(在本例中称为MyClassName
).
然而,正是这种行为——创建实例时注册 Win32 类——让我头疼。我希望能够预先注册该类,以便我可以将类名与另一个 3rd 方库一起使用,该库将使用 Win32 创建窗口CreateWindowEx
打电话,但我找不到简单的方法来做到这一点。目前我通过使用解决这个问题static
as the CreateWindowEx
类名,然后使用CMyWindow::SubclassWindow
将我的课程附加到它上面,但这是一个拼凑。
有谁知道如何注册CWindowImpl
派生类而不实际创建窗口,因此我可以将类名传递给CreateWindowEx
成功地?我认为有一种标准方法可以使用 ATL 窗口执行此操作,因为我不是第一个遇到此问题的人。
你试图做的事情不会成功。这是因为ATL/WTL Window的创建必须经过ATL类。该类注册了它的this带窗口的 ptrthunk http://www.codeproject.com/KB/atl/atl_underthehood_5.aspx。该 thunk 成为 WNDPROC 并用以下内容替换 WNDPROC 的 HWND 参数this对象实例的 ptr。
简而言之,如果您知道 ATL 窗口在幕后是如何工作的,您就不会尝试这样做。如果您能够注册窗口类,则 CreateWindowEx 调用将成功创建窗口。但是,不会创建 WNDPROC thunk,并且不会有对象实例与您的窗口关联,并且不会调用任何消息处理程序。相反,看看是否可以使用 CWindowImpl::Create 创建窗口,并在创建 ATL 控件后将其 hwnd 传递给第 3 方库。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)