预注册 ATL 窗口类

2024-05-07

我在一个项目中使用了 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(使用前将#替换为@)

预注册 ATL 窗口类 的相关文章

随机推荐

  • 如何使用 Windows forfiles 命令的完整路径运行命令?

    我正在尝试运行以下命令 forfiles p Schemas m xsd c cmd c C Program Files x86 Microsoft SDKs Windows v10 0A bin NETFX 4 6 1 Tools xsd
  • 如何在 AWS Elastic Beanstalk 上配置 WSGI 应用程序的名称?

    我的 Python Web 应用程序称为app example py import flask app flask Flask name split 0 当我尝试使用 AWS EB 启动它时 run py set correctly wit
  • 如何在 C# 中将 excel ListObject 添加到给定工作表?

    我目前正在 C 中开发一个 Excel 插件 其中包含多种方法 表值函数 可供 Excel 用户和程序员 VBA 使用 如何编写一个方法 将新的 ListObject Excel 表 添加到给定的 Excel 工作表 并将给定的 DataT
  • Socket.IO 消息不更新 Angular 变量

    我有一个 socket io 客户端 服务器设置 并在客户端上运行 AngularJS Server js var io require socket io server io on connection function socket s
  • ggplot2:为什么半透明+ pdflatex 会导致比普通 PDF 字体更重?

    ggplot2 为什么半透明 pdflatex 会导致比普通 PDF 字体更重 我遇到了一个问题pdf 在 R 中输入 然后pdflatex ing ggplot2 图像会导致同一页面上的所有文本与图像变得粗体 但仅当alpha requi
  • 如何使用蚂蚁?

    我一直试图了解 Ant 的用途 但我仍然不明白 有人可以给我一个使用 Ant 的用例吗 我可以尝试看看 Ant 为何有用以及我可以用它做什么 我在 Eclipse 中进行 Java 开发 并且刚刚开始使用 servlet 和 Google
  • 使用 DOMDocument 进行 PHP 编码

  • mysql_upgrade 失败 - innodb 表不存在?

    我正在将 mysql 5 5 docker 容器数据库升级到 mysql 5 6 docker 容器 我能够解决所有其他问题 最后我的服务器运行的是 5 6 但是当我运行 mysql upgrade 时出现以下错误 ERROR root 1
  • Scala 和 Spark:Windows 上的 Dataframe.write._

    有人设法使用 Spark 写入文件 尤其是 CSV 吗 数据框 http spark apache org docs latest api scala index html org apache spark sql Dataset在 Win
  • java.library.path 中没有 ocijdbc12

    我正在尝试使用 OCI 驱动程序通过 java 程序连接到 oracle 以下是配置 Windows 7 32 位 JDK 1 7 Oracle 客户端 11g R2 ojdbc7 jar在我的独立应用程序的类路径中 但我收到以下异常 Ex
  • AngularJS:在任何部分页面控制器之前调用特定函数

    我想调用一个特定的函数 GetSession 在我的应用程序加载开始时 这个函数使 http调用并获取会话令牌 GlobalSessionToken从服务器 然后 该会话令牌用于其他控制器逻辑并从服务器获取数据 我已经打电话给这个GetSe
  • 无法在 Google Cloud Function 中加载 node_modules(index.js,不在项目根目录上)

    因此 我需要部署 Google Cloud Function 以在 PostgreSQL 数据库 Cloud SQL 上发出选择请求 我需要使用 pg 模块 然后使用以下命令安装它 npm i pg 你需要知道我的项目目录是这样的 proj
  • 添加到 std::vector 的中间

    有没有办法将值添加到 a 的中间vector在 C 中 假设我有 vector
  • 在react中自定义useAxios钩子

    我正在使用 axios 和 React 所以我想为此编写一个自定义钩子 我这样做了 它工作正常 如下所示 const useAxios gt const response setResponse useState const error s
  • 弹性图表隐藏数据提示

    我们从多个源获取数据 并且某个日期的数据可能存在也可能不存在 因此 对于没有数据的点 我们发送 NaN 问题 在下面的代码中 有没有办法不显示那些为空的数据提示 我添加了一个数据提示功能 但它确实显示了一个小的空方块 是否有可能甚至不显示
  • VSCode 扩展的安全性和隐私性

    我发现 VSCode 有很多不错的扩展 然而 我担心这些扩展是否将我的代码发送到他们的任何服务器 有什么办法可以查到吗 我可以使用 fiddler 并隔离插件中可能发生的调用 但不想对我安装的每个扩展都这样做 VScode 团队对此有一些指
  • VS2015 nuget包管理器找不到包

    我安装了 VS2015 Update 2 现在 nuget 包管理器找不到 Microsoft 和 net 包源之外的任何包 看起来 nuget 包源已被删除 当我将其添加回 http www nuget org http www nuge
  • 外部“C”声明如何工作?

    我正在学习编程语言课程 我们正在讨论extern C 宣言 除了 它与 C 和 C 接口 之外 此声明如何在更深层次上工作 这对程序中发生的绑定有何影响 extern C 用于确保后面的符号不是mangled http en wikiped
  • 如何测量异步发电机所花费的时间?

    我想测量生成器花费的时间 阻塞主循环的时间 假设我有以下两个生成器 async def run for i in range 5 await asyncio sleep 0 2 yield i return async def walk f
  • 预注册 ATL 窗口类

    我在一个项目中使用了 ATL 和 WTL 的组合 并从中派生了我自己的类CWindowImpl 看起来像这样 class CMyControl public CWindowImpl