Mfc 检测CTRL+;带视图的车轮

Mfc 检测CTRL+;带视图的车轮,mfc,webbrowser-control,zooming,mousewheel,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;

我知道如何为
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
,我的一个用户表示他们使用CTRL+Wheel来更改缩放因子

我有我的菜单结构和相关的热键,用户可以使用这些热键来更改缩放,因此我的状态栏窗格将更新为他们选择的正确值

但是当他们使用CTRL+Wheel更改缩放时,我的应用程序没有检测到这一点。因此,他们放大或缩小到一定的比例,而我的状态栏窗格保持原始的缩放比例


使用MFC和
CHtmlView
web浏览器控制如何检测他们何时使用CTRL+Wheel更改了缩放,以便我可以更新我的状态窗格?

如果这是具有文档/视图结构的
CHtmlView
,请使用
PreTranslateMessage
捕获消息

用于查找虚拟关键点和车轮移动状态的多个宏的文档:

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);
    }
}

好啊但是我需要在它被处理后处理它,这样我才能得到新的缩放因子值。在我们处理它之前,它上面的Tge检测鼠标滚轮。所以缩放因子还没有改变。浏览器处理消息需要时间。手动处理消息,或使用
SetTimer/KillTimer
例程在读取缩放之前创建1秒延迟
CHtmlView::OnUpdate UI
也应该会收到通知,尽管它也可能不同步,这取决于您的代码是什么。请参阅编辑以生成等待函数,这可能是最简单的方法。还有更多控制缩放的快捷方式:
Ctrl
+
Plus
Ctrl
+
减号
Ctrl
+
0
(至少我知道)