我正在为一个项目使用 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 类——让我很头疼。我希望能够预先注册该类,以便我可以将类名与另一个第 3 方库一起使用,该库将使用 Win32 CreateWindowEx
调用创建窗口,但我找不到简单的方法来做到这一点。目前我通过使用 static
作为 CreateWindowEx
类名然后使用 CMyWindow::SubclassWindow
将我的类附加到它来解决这个问题,但这是一个kludge。
有谁知道如何在不实际创建窗口的情况下注册 CWindowImpl
派生类,这样我就可以成功地将类名传递给 CreateWindowEx
?我认为有一种标准方法可以使用 ATL 窗口执行此操作,因为我不是第一个遇到此问题的人。
最佳答案
您尝试做的事情不会奏效。这是因为ATL/WTL Window的创建必须经过ATL类。该类将其 this ptr 注册到窗口 thunk .此 thunk 成为 WNDPROC,并用对象实例的 this ptr 替换 WNDPROC 的 HWND 参数。
因此,简而言之,如果您知道 ATL 窗口在幕后是如何工作的,您就不会尝试尝试这个。如果您能够注册窗口类,则 CreateWindowEx 调用将成功创建窗口。但是,不会创建 WNDPROC thunk,并且不会有对象实例与您的窗口相关联,并且不会调用任何消息处理程序。相反,看看您是否可以使用 CWindowImpl::Create 创建窗口,并在创建后将 ATL 控件的 hwnd 传递给您的第 3 方库。
关于winapi - 预注册 ATL 窗口类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/575532/