IOleInPlaceSiteWindowless :: AdjustRect не работает? - PullRequest
0 голосов
/ 11 июля 2010

Я использую 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).

Ответы [ 2 ]

1 голос
/ 13 июля 2010

Для OnMouseOut на элементах управления без окон я обычно использую TrackMouseEvent на контейнере hwnd и монитор WM_MOUSELEAVE и WM_MOUSEMOVE.

Кроме того, при разработке элементов управления без окон имейте в виду, что некоторые контейнеры отказываются создавать экземпляры без окон, чтобы ваши элементы управления превратились в полноценные «оконные» элементы управления. В частности, MS Access такой зверь. В этом случае вам никогда не позвонят на IOleInPlaceObjectWindowless::OnWindowMessage, потому что у вас есть собственный hwnd.

0 голосов
/ 13 июля 2010

Удивительный Игорь Тандетник ответил на мой вопрос здесь:

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

Очевидно, что функция просто не реализована. IE должен вернуть E_NOTIMPLEMENTED

-Erik

...