gpt4 book ai didi

c++ - 处理复选框的 OnClick 事件

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:46:46 25 4
gpt4 key购买 nike

我正在尝试处理来自 BHO 的复选框控件的点击事件。

这是我的代码:

void STDMETHODCALLTYPE CMyBHO::OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL)
{
// ...

InitPage(pDocument);
}

void CMyBHO::InitPage(IHTMLDocument2 *pDocument)
{
CComQIPtr<IHTMLDocument3> document3 = pDocument;

CComPtr<IHTMLElement> elementCheckbox;
document3->getElementById(CComBSTR(L"checkbox_id_here"), &elementCheckbox);
if(!elementCheckbox)
return;

if(!m_fCheckboxAdvised)
{
// Register to sink events from HTMLDocumentEvents2.
hr = IHTMLElementEvents2Impl::DispEventAdvise(elementCheckbox);
if(SUCCEEDED(hr))
m_fCheckboxAdvised = TRUE;
else
ATLASSERT(0); // FAILS HERE, hr = 0x80040200
}
}

头文件:

class ATL_NO_VTABLE CMyBHO :
/*...*/
public IDispEventImpl<1, CMyBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>,
public IDispEventImpl<2, CMyBHO, &DIID_HTMLElementEvents2, &LIBID_MSHTML, 4, 0>
{
typedef IDispEventImpl<1, CMyBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1> IDWebBrowserEvents2Impl;
typedef IDispEventImpl<2, CMyBHO, &DIID_HTMLElementEvents2, &LIBID_MSHTML, 4, 0> IHTMLElementEvents2Impl;

public:

/*...*/

BEGIN_SINK_MAP(CMyBHO)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
SINK_ENTRY_EX(2, DIID_HTMLElementEvents2, DISPID_HTMLELEMENTEVENTS2_ONCLICK, OnMouseClick)
END_SINK_MAP()

public:
STDMETHOD(SetSite)(IUnknown *pUnkSite);

// DWebBrowserEvents2
void STDMETHODCALLTYPE OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL);

// HTMLDocumentEvents2
void STDMETHODCALLTYPE OnMouseClick(IHTMLEventObj *eventObj);

/*...*/
};

DispEventAdvise 失败,hr = 0x80040200。我做错了什么?

此外,我应该什么时候调用 DispEventUnadvise

最佳答案

您没有请求的连接点,因此 CONNECT_E_NOCONNECTION 失败。

与其为具有多个接口(interface)的 HTML 元素实现连接点客户端,您可能更喜欢替代路由并在事件接收器对象上实现 IDispatch,然后将接口(interface)指针分配给 onclick 属性的 HTML 元素。您将获得对该事件的 IDispatch::Invoke 调用。

这是一个代码片段,用于创建合适的 IDispatch 实现实例,并通过 C++ 代码设置 onresize 属性:

CComPtr<IHTMLElement> pBodyElementA;
ATLENSURE_SUCCEEDED(pDocument->get_body(&pBodyElementA));
CComPtr<IDispatch> pSinkDispatch;
ATLENSURE_SUCCEEDED(CDispatchEventSink::CreateInstance(&pSinkDispatch));
CComVariant vValue = pSinkDispatch;
ATLENSURE_SUCCEEDED(reinterpret_cast<CComPtr<IDispatch>&>(pBodyElementA).
PutPropertyByName(L"onresize", &vValue));

CDispatchEventSink 类是 here ,你也会在那里找到完整的示例项目(还有 SVN 链接)。

enter image description here

关于c++ - 处理复选框的 OnClick 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21089553/

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