winapi - 预注册 ATL 窗口类

标签 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()
};

这一切都很好,如果我使用 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/

相关文章:

c++ - Microsoft ATL 等同于 Borland OleCheck 函数

c++ - 尝试使用 DDX_CONTROL 连接控件时出错

c++ - 我对 CButton 进行子类化的尝试有什么问题?

c# - 添加 WHERE Name = 时出现无效查询错误

c - 使用 BitBlt 捕捉桌面像素颜色

c# - 无法并行读取同一个文件

c++ - 我应该如何在 ATL 项目中创建类?

c++ - 如何以编程方式更改非默认声音设备的音量?

c++ - 因错误使用 CComPtr 对象而导致的编译错误

c++ - 当用户取消时隐藏 CDialogImpl 对话框