gpt4 book ai didi

c++ - 直到鼠标事件才调用 ATL 控件上的 InPlaceActivate

转载 作者:搜寻专家 更新时间:2023-10-31 01:23:11 26 4
gpt4 key购买 nike

我有一个用 C++ 编写的 ActiveX 控件,它是我用 VS2008 和 ATL 创建的。在大多数情况下,它是一个非常标准的(没有从原始模板修改太多)控件,除了我没有使用 IDispatchImpl,而是创建了我自己的 IDispatchEx 实现。此控件仅在 Internet Explorer 中使用,我一直主要使用 IE8 进行测试。

一切都很好,除了出于某种原因,直到我将鼠标移到浏览器中托管对象标记的区域上时,InPlaceActivate 才会被调用;没有创建窗口,没有发送 WM_CREATE 消息等。

我已经尝试实现 DISPID_READYSTATE,但似乎无济于事。如果我调用 InPlaceActivate(OLEIVERB_UIACTIVATE);来自 SetClientSite方法,它通常有效,但这通常不是必需的。

为什么会这样?浏览器如何确定何时调用 InPlaceActivate(或触发它的任何调用)?

用于将ATL控件嵌入到页面中的标签是: <object id="plugin" type="application/x-vnd.FirebreathTemplatePlugin" width="300" height="300"></object>

您可以在此处找到该文件的完整源代码: http://code.google.com/p/firebreath/source/browse/src/ActiveXPlugin/FBControl.h

最佳答案

我找到了罪魁祸首。显然,OLEMSIC_ACTIVATEWHENVISIBLE 用于在 .rgs 文件中自动生成 %OLEMISC% 变量。但是,我已经覆盖了默认的 rgs 处理以提供我自己的变量,并且在这个过程中删除了一个关键行,这将添加一个:

[CLSID]/MiscStatus/1 = s '131473'

到注册表。这显然被浏览器用来决定如何初始化,并且该值具有 OLEMISC_ACTIVATEWHENVISIBLE“或”(|) 到它。将其重新添加进去,一切又恢复正常了。

关于c++ - 直到鼠标事件才调用 ATL 控件上的 InPlaceActivate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1891194/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com