对浏览器中的ActiveX控件如何交互不太懂。
举个例子吧。假设有2个ActiveX控件,其中一个控件A可以源源不断得到一些信息,比如说描述圆,矩形,多边形等图形的数据,然后这个控件要调用控件B的接口来画出圆,矩形,多边形。就是说控件A就管接受信息,是不可见的,控件B就管显示出来。但是控件A怎么得到在同一页面的控件B实例的接口,并调用这个接口绘图呢?始终没有想太明白。
在vc中当然是很好解决的了,很容易得到控件B的接口,但是在浏览器中怎么做,希望诸位大侠指点,本菜鸟对浏览器实在不懂
举个例子吧。假设有2个ActiveX控件,其中一个控件A可以源源不断得到一些信息,比如说描述圆,矩形,多边形等图形的数据,然后这个控件要调用控件B的接口来画出圆,矩形,多边形。就是说控件A就管接受信息,是不可见的,控件B就管显示出来。但是控件A怎么得到在同一页面的控件B实例的接口,并调用这个接口绘图呢?始终没有想太明白。
在vc中当然是很好解决的了,很容易得到控件B的接口,但是在浏览器中怎么做,希望诸位大侠指点,本菜鸟对浏览器实在不懂
这里面需要你编写脚本来粘合这两者。
void CICWXPlayerCtrl::SetHolderID(CICWXPlayerWindowHolder::enumHolderIndex iHolderIndex,LPCTSTR lpszElementID)
{
IOleClientSite* pClientSite=GetClientSite();
do{
if(pClientSite==NULL)break;
CComQIPtr pISP(pClientSite);
if(pISP==NULL)break;
CComPtr pIWebBrowser2;
pISP->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2,
(void **)&pIWebBrowser2);
if(pIWebBrowser2==NULL)break;
CComPtr spDocument;
pIWebBrowser2->get_Document(&spDocument);
CComQIPtr pIHTMLDocument2(spDocument);
if(pIHTMLDocument2==NULL)break;
CComPtr pHTMLElementCollection;
pIHTMLDocument2->get_all(&pHTMLElementCollection);
if(pHTMLElementCollection==NULL)break;
COleVariant varName(lpszElementID,VT_BSTR);
COleVariant varindex;CComPtr spElement;
pHTMLElementCollection->item(varName,varindex,&spElement);
if(spElement==NULL)break;
//is it an Iframe?
CComQIPtr pFrame(spElement);
if(pFrame){
switch(iHolderIndex){
case CICWXPlayerWindowHolder::WebHolder:
case CICWXPlayerWindowHolder::TextHolder:
m_holders[iHolderIndex].SetTarget(spElement);
break;
}
}
CComQIPtr pObjectElement(spElement);
if(pObjectElement==NULL)break;
CComPtr spObject;
pObjectElement->get_object(&spObject);
m_holders[iHolderIndex].SetTarget(spObject);
}
while(FALSE);
}
感谢蒋老大。这样一来就比较有趣了,假设控件B不停的接受服务器发来的信息,然后在B上画出来,不就成了CS模式而不是BS模式了,这倒挺有意思的,到底是什么模式也搞不清楚了。