代码之家  ›  专栏  ›  技术社区  ›  taxilian

InplaceActivate on ATL控件直到鼠标事件才调用

  •  1
  • taxilian  · 技术社区  · 15 年前

    我有一个用C++编写的ActiveX控件,用VS2008和ATL创建。在大多数情况下,它是一个相当标准的控件(从原始模板中修改不多),除了使用IDispatChimpl之外,我还创建了自己的IDispatchex实现。此控件仅在Internet Explorer中使用,我主要使用IE8进行测试。

    一切都很好,除了出于某种原因,在我将鼠标移到浏览器中对象标记所在的区域上之前,不会调用inplaceActivate;不会创建窗口,也不会发送wm_创建消息等。

    我尝试过实现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

    3 回复  |  直到 15 年前
        1
  •  1
  •   i_am_jorf    15 年前

    你试过回来吗 OLEMISC_ACTIVATEWHENVISIBLE 在你的内心 IOleObject::GetMiscStatus() 实施?

        2
  •  1
  •   Sheng Jiang 蒋晟    15 年前
        3
  •  1
  •   taxilian    15 年前

    我找到了罪犯。另外,在不可见的情况下,olemsic_activatewhen用于自动生成.rgs文件中的%olemisc%变量。但是,我已经重写了默认的rgs处理来提供我自己的变量,并且在这个过程中删除了一个关键行,这将添加一个:

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

    到注册表。浏览器将使用此功能来决定如何初始化,并且该值在不可见或“ed()”时已激活Olemisc_。补充说,回到和一切工作重新开始。