Я использую IOleInPlaceSiteWindowless :: AdjustRect для правильного захвата и отпускания мыши в элементе управления ActiveX без окон, размещенном в IE:
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.Он также возвращает S_OK, если мышь находится над элементом div, который покрывает часть моего элемента управления.
Эти результаты не соответствуют документации AdjustRect .
Для дальнейшей отладкиЯ переписал 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) х (2000, 2000).