2010-07-11 4 views
0

J'utilise IOleInPlaceSiteWindowless :: AdjustRect pour capturer correctement et libérer la souris dans un contrôle ActiveX sans fenêtre hébergé dans IE:IOleInPlaceSiteWindowless :: AdjustRect ne fonctionne pas?

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; 
} 

Lorsque la souris entre les choses rect de mon contrôle excellent travail et le contrôle capture de la souris. Cependant, lorsque ma souris quitte la zone de contrôle, AdjustRect renvoie toujours S_OK. Il renvoie également S_OK si la souris survole un div qui couvre une partie de mon contrôle. Ces résultats ne sont pas cohérents avec le code AdjustRect documentation.

Pour déboguer plus loin, je re-écrit 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; 
} 

Dans ce cas, AdjustRect renvoie également S_OK, mais le rectangle n'est pas réglé du tout! C'est toujours (0,0) x (2000,2000).

Répondre

1

Pour OnMouseOut sur les contrôles sans fenêtre que je utilise habituellement TrackMouseEvent sur le récipient hwnd et surveiller WM_MOUSELEAVE et WM_MOUSEMOVE. Gardez également à l'esprit, lors de la création de contrôles sans fenêtre, que certains conteneurs refusent l'instanciation sans fenêtre afin que vos contrôles se transforment en contrôles «fenêtrés» complets à cet endroit. Plus particulièrement MS Access est une telle bête. Dans ce cas, vous ne recevez jamais d'appel au IOleInPlaceObjectWindowless::OnWindowMessage parce que vous possédez votre propre appareil.

+0

TrackMouseEvent fonctionnera-t-il pour un contrôle sans fenêtre? Comme vous le dites, il me dira quand la souris quitte la fenêtre contenant, qui est la page HTML entière. Je veux savoir quand la souris quitte mon contrôle, qui peut être partiellement obscurci par des divs et d'autres éléments Html qui se chevauchent. Oui, certains conteneurs nécessitent une exécution fenêtrée. Il est beaucoup plus facile de faire face à ces - Vieux trucs comme le travail TrackMouseEvent ou SetCapture/Release. – user388147