我正在使用IOleInPlaceSiteWindowless :: AdjustRect在IE中托管的无窗口ActiveX控件中正确捕获和释放鼠标:
LRESULT CD3DControl::OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
CRect rc(CPoint(lParam), CSize(0, 0));
HRESULT hr = m_spInPlaceSite->AdjustRect(rc);
bool isInside = hr == S_OK;
TRACE("AdjustRect 0x%X, isInside=%d %d %d %d %d\n",
hr, isInside, rc.top, rc.left, rc.bottom, rc.right);
if (m_spInPlaceSite->GetCapture() == S_FALSE)
{
if (isInside)
{
hr = m_spInPlaceSite->SetCapture(TRUE);
TRACE("SetCapture(TRUE) 0x%X\n", hr);
}
}
else if (!isInside)
{
hr = m_spInPlaceSite->SetCapture(FALSE);
TRACE("SetCapture(FALSE) 0x%X\n", hr);
}
return 0;
}
当鼠标进入我的控件时,矩形工作效果很好,控件会捕获鼠标。但是,当我的鼠标离开控件的区域时,AdjustRect仍然返回S_OK。如果鼠标悬停在覆盖我控制部分的div上,它也会返回S_OK。
这些结果与AdjustRect documentation不一致。
为了进一步调试,我重写了OnMouseMove:
LRESULT CD3DControl::OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
CRect rc(0, 0, 2000, 2000);
HRESULT hr = m_spInPlaceSite->AdjustRect(&rc);
bool isInside = hr == S_OK;
TRACE("AdjustRect 0x%X, isInside=%d %d %d %d %d\n",
hr, isInside, rc.top, rc.left, rc.bottom, rc.right);
return 0;
}
在这种情况下,AdjustRect也返回S_OK,但矩形根本没有调整!它仍然是(0,0)x(2000,2000)。
答案 0 :(得分:1)
对于无窗口控件的OnMouseOut,我通常在容器hwnd上使用TrackMouseEvent
并监视WM_MOUSELEAVE
和WM_MOUSEMOVE
。
另外,在编写无窗口控件时请记住,某些容器拒绝无窗口实例化,因此您的控件会变成完全成熟的“窗口”控件。最值得注意的是MS Access就是这样的野兽。在这种情况下,您永远不会在IOleInPlaceObjectWindowless::OnWindowMessage
上接听电话,因为您拥有自己的hwnd。
答案 1 :(得分:0)
惊人的Igor Tandetnik在这里回答了我的问题:
显然,该功能并未实施。 IE应该返回E_NOTIMPLEMENTED
-Erik