回答(8)
在你的stdafx.h里加上下面这行:
#import "c:/windows/system/mshtml.tlb" no_namespace rename("UINT_PTR","wbUINT_PTR") rename("IHTMLControlElement","wbIHTMLControlElement")
编译后可以自动导入mshtml的类库,其实htmlview就是封装的mshtml啦。
你需要学习一些DHTML的知识,MSDN里是用VBScript描述的
Document.form1.button.OnClick就是click button了
至于捕获事件需要使用Sink或者ActiveX组件连接
Sink的好处是不需要额外的DLL组件,但作起来复杂
下面spDoc是GetDocument得到的IHTMLDocument2
在OnDocumentCompleteWb(LPDISPATCH pDisp, VARIANT FAR* URL) 里面:
try{
IUnknown *pUnk;
HRESULT hr = spDoc->QueryInterface(__uuidof(IConnectionPointContainer),
(void **)&pCPC);
if(FAILED(hr)) return;
hr = pCPC->FindConnectionPoint(__uuidof(HTMLDocumentEvents), &pCP);
pCPC->Release();
if (FAILED(hr)) return;
if(!pDocEvent) {
pDocEvent=new IHTMLDocCon();
pDocEvent->Init(GetSafeHwnd(), WM_USER_WB);
}
hr = pDocEvent->QueryInterface(__uuidof(IUnknown), (void **) &pUnk);
if (FAILED(hr)) return;
hr = pCP->Advise(pUnk, &dwConnEvt);
pCP->Release();
pDocEvent->Release();
if (FAILED(hr)) return;
}catch(...){
}
pDocEvent就是你作的sink,基类是HTMLDocumentEvents,主要需要实现Invoke方法:
switch(dispIdMember){
case DISPID_HTMLDOCUMENTEVENTS_ONCLICK:
vRet=onclick();
vRet.ChangeType(VT_BOOL);
break;
.............
这里就是实现的捕获点击事件,用个方法,比如sendmessage传回主windows,然后:得到事件类型和事件源:
IHTMLWindow2Ptr curWin=spDoc->GetparentWindow();
IHTMLEventObjPtr event=curWin->Getevent();
IHTMLElementPtr ele=event->GetsrcElement();
然后你就处理吧。
另外一种方法比较简单,是做个activex dll,用向导就成,做个class, 有个
回答人:
软界网友 我来回答