mshtml 获取 frame 中某个点元素的问题

iarate 2012-11-12 11:20:26
CWebBrowser2 加载某个html页面
页面里面有2个frame
如何获得鼠标点击位置的元素?
大家看下下面的代码有什么问题?

现在是 Frame 能获取到,再调用 elementFromPoint 也能获取到元素,但是不是我点击的元素?
是 坐标 换算的问题吗?

//
BOOL CDlgTest2Dlg::PreTranslateMessage(MSG* pMsg)
{
CRect brect;

m_browser.GetWindowRect(&brect);

m_browser.GetClientRect(&brect);

CPoint point(pMsg->pt);

m_browser.ScreenToClient(&point);

if (!brect.PtInRect(point))
{
return CDialog::PreTranslateMessage(pMsg);
}


IHTMLDocument2* pdoc2=NULL;
IHTMLElement* pElement=NULL;
IHTMLRectCollection *pCollection = NULL;

IHTMLDocument2* pdoc3=NULL;
IHTMLElement* pElement2=NULL;


IDispatch* pDisp=NULL;
pDisp = m_browser.GetDocument();

if (pDisp == NULL) return TRUE;

pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pdoc2);
pDisp->Release();

if (pdoc2 == NULL) return TRUE;

pdoc2->elementFromPoint (point.x,point.y ,&pElement);
pdoc2->Release();
if(pElement != NULL)
{
_variant_t vvv;
pElement->getAttribute(_bstr_t("name"),0,&vvv);

CString vvv2 = vvv.operator _bstr_t().operator char*();

TRACE("vvv2 = %s\r\n",vvv2);

_variant_t tag = _bstr_t("");

pElement->get_tagName(&tag.bstrVal);

CString button2 = tag.operator _bstr_t().operator char*();

TRACE("tag = %s\r\n",button2);

CString button;

if (button2 == "FRAME")
{
long l;
pElement->get_offsetLeft(&l);

long t;
pElement->get_offsetTop(&t);

TRACE("offsetLeft = %d offsetTop = %d\r\n",l,t);
TRACE("x = %d y = %d\r\n",point.x,point.y);

TRACE("x1 = %d y1 = %d\r\n",point.x - l,point.y - t);

IDispatch* pDisp2=NULL;
pElement->get_document(&pDisp2);


pDisp2->QueryInterface(IID_IHTMLDocument2,(void**)&pdoc3);
pDisp2->Release();

CPoint p3;
p3.x = point.x - l;
p3.y = point.y - t;

pdoc3->elementFromPoint (p3.x,p3.y,&pElement2);
pdoc3->Release();

BSTR bStr;
pElement2->get_innerHTML(&bStr);
CString szTemp;
szTemp = bStr;

TRACE("html = %s\r\n",szTemp.Left(200));
//
// BSTR bStr2;

_variant_t id = _bstr_t("");

pElement2->get_id(&id.bstrVal);

button = id.operator _bstr_t().operator char*();

TRACE("id = %s\r\n",button);
...全文
273 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2012-11-12
  • 打赏
  • 举报
回复
已经解决了?~
iarate 2012-11-12
  • 打赏
  • 举报
回复
我自己解决了。

坐标是对的,但是 frame 对应的 document 不是根据 elment 获取的。
参照: http://hi.baidu.com/ouanan/item/29984ad1f429e2cc1b72b4eb

if (button2 == "FRAME")
{
long l;
pElement->get_offsetLeft(&l);

long t;
pElement->get_offsetTop(&t);

TRACE("offsetLeft = %d offsetTop = %d\r\n",l,t);
TRACE("x = %d y = %d\r\n",point.x,point.y);

TRACE("x1 = %d y1 = %d\r\n",point.x - l,point.y - t);

IHTMLFramesCollection2 *pFrames;
pdoc2->get_frames(&pFrames);

_variant_t index = long (1);
_variant_t varResult;
pFrames->item(&index,&varResult);

IDispatch *pDispatch1 = varResult;

IHTMLWindow2 *pWindows;

pDispatch1->QueryInterface(IID_IHTMLWindow2,(void**)&pWindows);
pDispatch1->Release();

pWindows->get_document(&pdoc3);
pWindows->Release();


// IHTMLWindow2 *pWindows2;
// pElement->QueryInterface(IID_IHTMLWindow2,(void**)&pWindows2);
//
// pWindows2->get_document(&pdoc3);
// pWindows2->Release();


// IDispatch* pDisp2=NULL;
// pElement->get_document(&pDisp2);
//
//
// pDisp2->QueryInterface(IID_IHTMLDocument2,(void**)&pdoc3);
// pDisp2->Release();


CPoint p3;
p3.x = point.x - l;
p3.y = point.y - t;

pdoc3->elementFromPoint (p3.x,p3.y,&pElement2);
pdoc3->Release();

if (pElement2 == NULL)
return CDialog::PreTranslateMessage(pMsg);


BSTR bStr;
pElement2->get_innerHTML(&bStr);
CString szTemp;
szTemp = bStr;

TRACE("html = %s\r\n",szTemp.Left(200));
//
// BSTR bStr2;

_variant_t id = _bstr_t("");

pElement2->get_id(&id.bstrVal);

button = id.operator _bstr_t().operator char*();

TRACE("id = %s\r\n",button);

}
iarate 2012-11-12
  • 打赏
  • 举报
回复
http://www.microsoftfaqs.com/msg/1517612.aspx 这儿有个介绍,我看得不是很懂: You seem to misunderstand how offsetX and offsetY work. They return coordinates of the element relative to its parent element, as specified in offsetParent. You add offsetX and offsetY off the parent element, then off the parent's parent and so on, until you reach the element with offsetParent=null (normally, that would be the document). At this point, you have the coordinates of the original element relative to its containing document. If this containing document is in a frame, then your coordinates are relative to this frame. 控件里面的点位置 换算成 frame 的点位置,再用 document -> elementFromPoint 获取? document 里面点的坐标 应该是 frame 左上角 0,0 开始吗?

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧