使用 CHtmlView 检测 CTRL+Wheel
Detecting CTRL+Wheel with CHtmlView
我知道如何设置 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 + 滚轮 改变缩放系数。
我的菜单结构带有关联的热键,用户可以使用这些热键来更改缩放比例,因此我的状态栏窗格会更新为他们选择的正确值。
但是当他们使用 CTRL + Wheel 更改缩放比例时,我的应用程序没有检测到这一点。所以他们放大或缩小到一定比例,而我的状态栏窗格保持原始缩放系数。
使用 MFC 和 CHtmlView
网络浏览器控制如何使用 CTRL + Wheel[=30= 检测何时更改缩放] 这样我就可以更新我的状态面板了?
如果这是具有 Doc/View 结构的 CHtmlView
,请使用 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);
}
}
我知道如何设置 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 + 滚轮 改变缩放系数。
我的菜单结构带有关联的热键,用户可以使用这些热键来更改缩放比例,因此我的状态栏窗格会更新为他们选择的正确值。
但是当他们使用 CTRL + Wheel 更改缩放比例时,我的应用程序没有检测到这一点。所以他们放大或缩小到一定比例,而我的状态栏窗格保持原始缩放系数。
使用 MFC 和 CHtmlView
网络浏览器控制如何使用 CTRL + Wheel[=30= 检测何时更改缩放] 这样我就可以更新我的状态面板了?
如果这是具有 Doc/View 结构的 CHtmlView
,请使用 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);
}
}