mfc - 使用 CHtmlView 检测 CTRL+Wheel

标签 mfc webbrowser-control zooming mousewheel

我知道如何为 CHtmlView 设置缩放系数:

HRESULT CChristianLifeMinistryHtmlView::SetZoomFactor(long iZoom, bool bRefreshBrowser /*true*/)
{
    HRESULT hr = S_OK;
    VARIANT vZoom;

    m_lZoomFactor = iZoom;

    if (bRefreshBrowser)
    {
        vZoom.vt = VT_I4;
        vZoom.lVal = iZoom;

        hr = ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, &vZoom, nullptr);
    }

    return hr;
}

HRESULT CChristianLifeMinistryHtmlView::ExecWB(OLECMDID cmdID, OLECMDEXECOPT cmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
{
    HRESULT hr;

    ASSERT(m_pBrowserApp != NULL);

    hr = m_pBrowserApp->ExecWB(cmdID, cmdexecopt, pvaIn, pvaOut);
    return hr;
}

我刚刚介绍了一个CStatusBar进入包含此 View 的主编辑器,我的一位用户表示他们使用 CTRL + 滚轮来更改缩放系数。

我的菜单结构带有相关联的热键,用户可以使用这些热键来更改缩放比例,因此我的状态栏 Pane 会更新为他们选择的正确值。

但是当他们使用 CTRL + Wheel 更改缩放比例时,我的应用程序没有检测到这一点。所以他们按比例放大或缩小,我的状态栏 Pane 保持原始缩放系数。

使用 MFC 和 CHtmlView Web 浏览器控件如何检测他们何时使用 CTRL + 滚轮更改了缩放比例,以便我可以更新我的状态 Pane ?

最佳答案

如果这是 CHtmlView使用 Doc/View 结构,使用 PreTranslateMessage来捕捉消息。

WM_MOUSEWHEEL 的文档建议使用几个宏来查找虚拟键和滚轮运动的状态:

BOOL CMyHtmlView::PreTranslateMessage(MSG* pmsg)
{
    if(pmsg->message == WM_MOUSEWHEEL)
    {
        int fwKeys = GET_KEYSTATE_WPARAM(pmsg->wParam);
        int zDelta = GET_WHEEL_DELTA_WPARAM(pmsg->wParam);
        if (fwKeys & MK_CONTROL)
        {
            //mousewheel + control key is down
            TRACE("%d %d\n", zDelta, zDelta / WHEEL_DELTA);

            //update statusbar, or return TRUE to handle this manually
        }
    }
    return CHtmlView::PreTranslateMessage(pmsg);
}
CHtmlView也有自己的CHtmlView::ExecWB设置和获取缩放值等的方法。
CHtmlView::OnUpdateUI还应发送更改通知。

但是浏览器可能不会在正确的时间发送信号。只需在检测到 CTRL+WHEEL 后制作一个计时器等待 1 秒。例子:
BEGIN_MESSAGE_MAP(CMyHtmlView, CHtmlView)
    ON_WM_TIMER()
END_MESSAGE_MAP()

const int ID_TIMER_ZOOM = 1;

BOOL CMyHtmlView::PreTranslateMessage(MSG* pmsg)
{
    if(pmsg->message == WM_MOUSEWHEEL)
        if (GET_KEYSTATE_WPARAM(pmsg->wParam) & MK_CONTROL)
            SetTimer(ID_TIMER_ZOOM, 1000, NULL); //start timer for detecting zoom
    return CHtmlView::PreTranslateMessage(pmsg);
}

void CMyHtmlView::OnTimer(UINT_PTR timer_id)
{
    if(timer_id == ID_TIMER_ZOOM)
    {
        //get the zoom value
        VARIANT vZoom;
        vZoom.vt = VT_I4;
        vZoom.lVal = 0;
        ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, nullptr, &vZoom);
        TRACE("zoom %d\n", vZoom.lVal);

        //kill the timer
        KillTimer(timer_id);
    }
}

关于mfc - 使用 CHtmlView 检测 CTRL+Wheel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51811423/

相关文章:

C++ MFC 序列化

c++ - 使用 CString 在 C++ 中重复一个字符不同次数

c++ - Visual Studio 无法识别我的网络摄像头激光测距仪代码的 MFC 库

c# - WebBrowser 文档完成事件 C#

css - 由于悬停时的过渡/缩放,移动设备上的滚动困难

c++ - 在目录中搜索文件

c# - WebBrowser 控件继续执行脚本,没有脚本错误警告框

c# - System.Windows.Forms.WebBrowser 似乎禁用了 javascript?

java - 监听 JFreeChart 中的缩放重置事件

c++ - 如何在 OpenGL 中进行 2D 缩放(GLFW,很高兴)?