Winapi 预注册ATL窗口类

Winapi 预注册ATL窗口类,winapi,atl,wtl,classname,Winapi,Atl,Wtl,Classname,我正在为一个项目使用ATL和WTL的组合,并从CWindowImpl派生了我自己的类,它看起来像这样: class CMyControl : public CWindowImpl<CMyControl> { public: DECLARE_WND_CLASS(_T("MyClassName")) ... BEGIN_MSG_MAP(CMyControl) ... END_MSG_MAP() }; class CMY控件:公共CWind

我正在为一个项目使用ATL和WTL的组合,并从
CWindowImpl
派生了我自己的类,它看起来像这样:

class CMyControl : public CWindowImpl<CMyControl>
{
public:
    DECLARE_WND_CLASS(_T("MyClassName"))
    ...
    BEGIN_MSG_MAP(CMyControl)
        ...
    END_MSG_MAP()
};
class CMY控件:公共CWindowImpl
{
公众:
声明类(MyClassName)
...
开始消息映射(CMyControl)
...
END_MSG_MAP()
};
这一切都很好,如果我使用
CMyControl::Create
来创建控件的实例,那么它可以正常工作,因为在后台,
CWindowImpl::Create
函数将注册Win32类(在本例中称为
MyClassName

然而,正是这种行为——创建实例时注册Win32类——让我头疼。我希望能够提前注册该类,这样我就可以使用另一个第三方库的类名,该库将使用Win32
CreateWindowEx
调用创建窗口,但我找不到简单的方法来实现这一点。目前,我通过使用
static
作为
CreateWindowEx
类名来解决这个问题,然后使用
CMyWindow::SubclassWindow
将我的类附加到它,但这是一个难题

有人知道如何注册
CWindowImpl
派生类而不实际创建窗口,这样我就可以成功地将类名传递给
CreateWindowEx
?我认为ATL windows有一个标准的方法来实现这一点,因为我不是第一个遇到这个问题的人。

您可以直接调用Win32 API函数

您可以使用:

WNDPROC pUnusedWndSuperProc; 
pUnusedWndSuperProc = NULL;
CMyControl::GetWndClassInfo().Register(&pUnusedWndSuperProc);

虽然。。。我不知道为什么不创建一个窗口实例并将其隐藏起来。这有一点开销,但它避免了破坏窗口逻辑(这是非常复杂的事情……你最不想看到的就是“砰”的一声出现了一些意想不到或不寻常的问题。)。

你试图做的事情行不通。这是因为创建ATL/WTL窗口必须通过ATL类。该类向一个窗口注册它的ptr。此thunk将成为WNDPROC,并用对象实例的此ptr替换WNDPROC的HWND参数

因此,简而言之,如果您知道ATL窗口在引擎盖下是如何工作的,您就不会尝试这个。如果您能够注册窗口类,CreateWindowEx调用将成功创建窗口。但是,不会创建WNDPROC thunk,也不会有对象实例与窗口关联,也不会调用任何消息处理程序。相反,请查看是否可以使用CWindowImpl::create创建窗口,并在创建ATL控件后将其hwnd传递给第三方库