CHtmlView中实时获取鼠标指针位置坐标
2014-07-03 17:24
519 查看
CHtmlView中无法直接响应OnLButtonDown等一系列函数。以下方法是一种实现思路。
在前面的《CHtmlView 和 Webbrowser 控件中超链接点击事件的获取与检测》一文中演示了如何截获并响应超链接单击事件。用类似的方法还可以在 VC++ 中处理很多其他的网页事件,例如实时的在状态栏上显示鼠标正在指向的网页元素或鼠标指针相对于网页原点的位置。
这次需要响应的是
下面需要在
现在,当鼠标在网页上移动时,就会触发相应网页元素的
直接在
网页窗口有2个像素的 border,计算坐标时需要把它们考虑进去。
具体代码如下:
在前面的《CHtmlView 和 Webbrowser 控件中超链接点击事件的获取与检测》一文中演示了如何截获并响应超链接单击事件。用类似的方法还可以在 VC++ 中处理很多其他的网页事件,例如实时的在状态栏上显示鼠标正在指向的网页元素或鼠标指针相对于网页原点的位置。
这次需要响应的是
DISPID_HTMLELEMENTEVENTS2_ONMOUSEMOVE消息,因此,Event handler 需要改成下面的样子:
// DocEvtHandler.h // SDocEvtHandler 消息处理类声明 by 旧日重来 #pragma once #import <mshtml.tlb> class SDocEvtHandler : public CCmdTarget { DECLARE_DYNAMIC(SDocEvtHandler) public: SDocEvtHandler(); virtual ~SDocEvtHandler(); // 消息处理函数 void OnMouseMove(MSHTML::IHTMLEventObjPtr pEvtObj); DECLARE_MESSAGE_MAP() DECLARE_DISPATCH_MAP() DECLARE_INTERFACE_MAP() };
// DocEvtHandler.cpp // SDocEvtHandler 消息处理类实现 by 旧日重来 #include "stdafx.h" #include "DocEvtHandler.h" #include "mshtmdid.h" IMPLEMENT_DYNAMIC(SDocEvtHandler, CCmdTarget) SDocEvtHandler::SDocEvtHandler() { EnableAutomation(); // 重要:激活 IDispatch } SDocEvtHandler::~SDocEvtHandler() { } BEGIN_MESSAGE_MAP(SDocEvtHandler, CCmdTarget) END_MESSAGE_MAP() BEGIN_DISPATCH_MAP(SDocEvtHandler, CCmdTarget) DISP_FUNCTION_ID(SDocEvtHandler,"HTMLELEMENTEVENTS2_ONMOUSEMOVE", DISPID_HTMLELEMENTEVENTS2_ONMOUSEMOVE, OnMouseMove, VT_EMPTY, VTS_DISPATCH) END_DISPATCH_MAP() BEGIN_INTERFACE_MAP(SDocEvtHandler, CCmdTarget) INTERFACE_PART(SDocEvtHandler, DIID_HTMLButtonElementEvents2, Dispatch) END_INTERFACE_MAP() void SDocEvtHandler::OnMouseMove(MSHTML::IHTMLEventObjPtr pEvtObj) { // 事件处理代码...详见下节 }
下面需要在
DocumentComplete时安装网页事件响应函数,并在适当的时候释放,这部分与前文基本一致,详情可以猛击这里。
现在,当鼠标在网页上移动时,就会触发相应网页元素的
ONMOUSEMOVE事件,而回调的参数就是鼠标指针正在指向的网页元素指针
IHTMLEventObj。更进一步,我们可以通过目标
IHTMLEventObj得到当前鼠标相对于网页原点(左上角)的坐标。这里需要注意两点:
直接在
IHTMLEventObj上得到的是鼠标相对于网页控件窗口左上角的坐标,因此需要通过窗口的滚动状态换算到整个网页的左上角
网页窗口有2个像素的 border,计算坐标时需要把它们考虑进去。
具体代码如下:
void SDocEvtHandler::OnMouseMove(MSHTML::IHTMLEventObjPtr pEvtObj) { // 获取鼠标坐标 long nOffsetX = pEvtObj->Getx(); long nOffsetY = pEvtObj->Gety(); // 处理 Webbrowser 控件的滚动信息 MSHTML::IHTMLDocument3Ptr pDoc3 = m_pDocument; MSHTML::IHTMLElement2Ptr pDocEle = pDoc3->GetdocumentElement(); MSHTML::IHTMLElement2Ptr pBody = m_pDocument->Getbody(); long nScrollLeft = pDocEle->GetscrollLeft(); long nScrollTop = pDocEle->GetscrollTop(); if(!nScrollLeft) nScrollLeft = pBody->GetscrollLeft(); if(!nScrollTop) nScrollTop = pBody->GetscrollTop(); // 处理 Webbrowser 控件的边框 nOffsetX += nScrollLeft - 2; nOffsetY += nScrollTop - 2;
相关文章推荐
- 获取鼠标实时位置坐标
- 实时显示鼠标指针相对于浏览器X轴Y轴坐标位置
- 获取鼠标位置的三维坐标
- 在skyline中获取当前鼠标的位置坐标,屏蔽右键菜单
- 鼠标指针位置坐标
- 获取当前鼠标指针位置文本
- WinAPI: GetCursorPos - 获取鼠标指针的当前位置
- 用javascript获取鼠标坐标位置
- JS获取鼠标的坐标和滚动条的位置
- delphi 获取鼠标当前位置的相对坐标
- MFC 获取picture控件的鼠标点击坐标位置的方法
- 用 javascript 获取鼠标(光标)的坐标位置 兼容IE/Firefox等浏览器
- js与jquery中获取当前鼠标的x、y坐标位置的代码
- 获取鼠标指针在ListBox中的行位置
- 【JS温故知新】之——给力的鼠标坐标位置获取
- JS获取鼠标的坐标和滚动条的位置
- JS获取area元素坐标和鼠标在页面中的位置
- delphi2010获取鼠标指向窗口的位置及鼠标在窗口内的相对位置坐标
- 【JS温故知新】之——给力的鼠标坐标位置获取(转)
- 获取鼠标当前位置坐标的方法 - 回复 "ps8.0" 同学