IOleInPlaceSiteWindowless :: AdjustRect不工作?

时间:2010-07-11 14:49:04

标签: com activex ole

我正在使用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)。

2 个答案:

答案 0 :(得分:1)

对于无窗口控件的OnMouseOut,我通常在容器hwnd上使用TrackMouseEvent并监视WM_MOUSELEAVEWM_MOUSEMOVE

另外,在编写无窗口控件时请记住,某些容器拒绝无窗口实例化,因此您的控件会变成完全成熟的“窗口”控件。最值得注意的是MS Access就是这样的野兽。在这种情况下,您永远不会在IOleInPlaceObjectWindowless::OnWindowMessage上接听电话,因为您拥有自己的hwnd。

答案 1 :(得分:0)

惊人的Igor Tandetnik在这里回答了我的问题:

http://social.msdn.microsoft.com/Forums/en-US/ieextensiondevelopment/thread/b8586255-0321-450e-9c8a-090e47ce13c4/

显然,该功能并未实施。 IE应该返回E_NOTIMPLEMENTED

-Erik