Please update the source code for the following method:
LRESULT CALLBACK CExtPopupMenuSite::_HookMouseProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
)
{
__PROF_UIS_MANAGE_STATE;
if( nCode != HC_ACTION )
return
::CallNextHookEx(
g_DefPopupMenuSite.m_hMouseHook,
nCode,
wParam,
lParam
);
MOUSEHOOKSTRUCT* lpMS = (MOUSEHOOKSTRUCT*)lParam;
ASSERT( lpMS != NULL );
if( CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON != NULL )
{
switch( wParam )
{
case WM_MOUSEMOVE:
{
CPoint pt( lpMS->pt );
if( CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->
_OnMouseMove(
(UINT)wParam,
pt
)
)
return 1; // eat!
}
break;
case WM_MOUSEWHEEL:
{
if( CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->
_OnMouseWheel(
wParam,
lParam
)
)
return 1; // eat!
}
break;
case WM_NCLBUTTONDOWN:
case WM_NCRBUTTONDOWN:
case WM_NCMBUTTONDOWN:
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_NCLBUTTONUP:
case WM_NCRBUTTONUP:
case WM_NCMBUTTONUP:
case WM_LBUTTONUP:
case WM_RBUTTONUP:
case WM_MBUTTONUP:
{
CPoint ptSrc( lpMS->pt );
if( CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->_OnMouseClick(
(UINT)wParam,
ptSrc
)
)
return 1; // eat!
}
break;
} // switch( wParam )
}
if( nCode == HC_ACTION // +2.55 - fix by Ulrich Berger-Kubik
&& (! g_DefPopupMenuSite.IsEmpty() )
&& (! g_DefPopupMenuSite.IsShutdownMode() )
)
{
CExtPopupMenuWnd * pWndCapture =
g_DefPopupMenuSite.GetCapture();
if( pWndCapture != NULL
&& ::IsWindow( pWndCapture->GetSafeHwnd() )
)
{
ASSERT_VALID( pWndCapture );
CExtBarButton * pSavedTrackingMenuTBB = CExtBarButton::g_pTrackingMenuTBB;
switch( wParam )
{
//case WM_MOUSEACTIVATE:
// if( lpMS->hwnd != pWndCapture->GetSafeHwnd() )
// return 1;
//break;
case WM_MOUSEMOVE:
{
CPoint pt( lpMS->pt );
pWndCapture->ScreenToClient( &pt );
bool bNoEat = false;
if( pWndCapture->
_OnMouseMove(
(UINT)wParam,
pt,
bNoEat
)
)
{
HWND hWnd = ::WindowFromPoint( lpMS->pt );
if( hWnd != NULL
&& ::GetWindowThreadProcessId( hWnd, NULL ) == ::GetCurrentThreadId()
)
{
INT nHT = (INT)::SendMessage( hWnd, WM_NCHITTEST, 0L, MAKELPARAM(lpMS->pt.x,lpMS->pt.y) );
INT nMM = WM_MOUSEMOVE;
if( nHT != HTCLIENT
&& nHT != HTMINBUTTON
&& nHT != HTMAXBUTTON
&& nHT != HTHELP
&& nHT != HTCLOSE
&& nHT != HTNOWHERE
)
nMM = WM_NCMOUSEMOVE;
else
nHT = HTCLIENT;
::SendMessage( hWnd, WM_SETCURSOR, (WPARAM)hWnd, MAKELPARAM(nHT,nMM) );
}
return 1; // eat!
}
if( bNoEat )
return
::CallNextHookEx(
g_DefPopupMenuSite.m_hMouseHook,
nCode,
wParam,
lParam
);
}
break;
case WM_MOUSEWHEEL:
{
bool bNoEat = false;
if( pWndCapture->
_OnMouseWheel(
wParam,
lParam,
bNoEat
)
)
return 1; // eat!
if( bNoEat )
return
::CallNextHookEx(
g_DefPopupMenuSite.m_hMouseHook,
nCode,
wParam,
lParam
);
return 1; // eat!
}
break;
case WM_NCLBUTTONDBLCLK:
case WM_NCRBUTTONDBLCLK:
case WM_NCMBUTTONDBLCLK:
case WM_LBUTTONDBLCLK:
case WM_RBUTTONDBLCLK:
case WM_MBUTTONDBLCLK:
CExtBarButton::g_pTrackingMenuTBB = NULL;
// continue ...
case WM_NCLBUTTONDOWN:
case WM_NCRBUTTONDOWN:
case WM_NCMBUTTONDOWN:
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_NCLBUTTONUP:
case WM_NCRBUTTONUP:
case WM_NCMBUTTONUP:
case WM_LBUTTONUP:
case WM_RBUTTONUP:
case WM_MBUTTONUP:
{
HWND hWndFromPoint = WindowFromPoint( lpMS->pt );
LRESULT nHT =
::SendMessage(
hWndFromPoint,
WM_NCHITTEST,
0L,
MAKELPARAM( lpMS->pt.x, lpMS->pt.y )
);
if( hWndFromPoint != NULL )
{
if( ( nHT == HTSYSMENU || nHT == HTCAPTION )
&& wParam != WM_NCLBUTTONUP
&& ( ! g_PaintManager.m_DWM.IsCompositionEnabled() )
)
{
CWnd * pWndFromPointPermanent = CWnd::FromHandlePermanent( hWndFromPoint );
if( pWndFromPointPermanent == NULL
|| (! pWndFromPointPermanent->IsKindOf( RUNTIME_CLASS(CMiniFrameWnd) ) )
)
{
pWndCapture->TrackFlagsSet( pWndCapture->TrackFlagsGet() | TPMX_NO_FADE_OUT_ANIMATION );
CExtToolControlBar::_CloseTrackingMenus();
CExtPopupMenuWnd::CancelMenuTracking();
return
::CallNextHookEx(
g_DefPopupMenuSite.m_hMouseHook,
nCode,
wParam,
lParam
);
}
}
} // if( hWndFromPoint != NULL )
//CRect rcWndCapture;
//_pWndCapture->GetWindowRect( &rcWndCapture );
//if( !rcWndCapture.PtInRect(lpMS->pt) )
// break;
CPoint ptSrc( lpMS->pt );
pWndCapture->ScreenToClient( &ptSrc );
bool bSameToolBarButtonIsClicked = false;
CExtPopupMenuWnd * pDefInstancePopup = CExtPopupMenuSite::g_DefPopupMenuSite.GetInstance();
CPoint pt( lpMS->pt );
HWND hWndPT = ::WindowFromPoint( pt );
CWnd * pWndPermanentPT = NULL;
if( hWndPT != NULL )
pWndPermanentPT = CWnd::FromHandlePermanent( hWndPT );
if( pDefInstancePopup != NULL
&& pWndPermanentPT != NULL
&& pSavedTrackingMenuTBB != NULL
&& ( wParam == WM_LBUTTONDOWN || wParam == WM_LBUTTONDBLCLK )
)
{
ASSERT_VALID( pDefInstancePopup );
ASSERT( ::IsWindow(pDefInstancePopup->GetSafeHwnd()) );
if( ( ! pDefInstancePopup->m_rcExcludeArea.IsRectEmpty() )
&& pDefInstancePopup->m_rcExcludeArea.PtInRect( pt )
&& pWndPermanentPT != NULL
&& pWndPermanentPT->IsKindOf( RUNTIME_CLASS( CExtToolControlBar ) )
)
{
CPoint ptBarClient = pt;
pWndPermanentPT->ScreenToClient( &ptBarClient );
INT nHtTbb = ((CExtToolControlBar*)pWndPermanentPT)->HitTest( ptBarClient );
if( nHtTbb >= 0 && LPVOID(((CExtToolControlBar*)pWndPermanentPT)->GetButton(nHtTbb)) == LPVOID(pSavedTrackingMenuTBB) )
bSameToolBarButtonIsClicked = true;
}
}
DWORD dwCTF = pWndCapture->TrackFlagsGet();
bool bNoEat = false;
HWND hWndCapture = pWndCapture->GetSafeHwnd();
ASSERT( hWndCapture != NULL && ::IsWindow(hWndCapture) );
if( pWndCapture->_OnMouseClick(
(UINT)wParam,
ptSrc,
bNoEat
)
)
{
if( ( ! bNoEat )
&& ( dwCTF & TPMX_SYSMENU ) != 0
&& ( wParam == WM_NCLBUTTONDOWN || wParam == WM_NCLBUTTONDBLCLK )
&& nHT == HTSYSMENU
)
return
::CallNextHookEx(
g_DefPopupMenuSite.m_hMouseHook,
nCode,
wParam,
lParam
);
if( ! bSameToolBarButtonIsClicked )
return 1; // eat!
}
if( ( ! bNoEat )
&& ( dwCTF & TPMX_SYSMENU ) != 0
&& ( wParam == WM_NCLBUTTONDOWN || wParam == WM_NCLBUTTONDBLCLK )
&& nHT == HTSYSMENU
)
bNoEat = true;
if( bNoEat )
return
::CallNextHookEx(
g_DefPopupMenuSite.m_hMouseHook,
nCode,
wParam,
lParam
);
if( ! (::IsWindow(hWndCapture)) )
return 1; // eat!
// post processing
if( hWndPT != NULL )
{
CExtPopupMenuWnd * pPopup = pWndCapture;
for( ; pPopup != NULL; pPopup = pPopup->m_pWndParentMenu )
{
CPoint ptClient( pt );
pPopup->ScreenToClient( &ptClient );
if( pPopup->_PtInWndArea(ptClient) )
return 1; // eat!
CExtPopupMenuTipWnd & _tipWnd = pPopup->GetTip();
HWND hWndTest = _tipWnd.GetSafeHwnd();
if( hWndTest != NULL )
{
if( hWndTest == hWndPT
|| ::IsChild( hWndTest, hWndPT )
)
return 1; // eat!
} // if( hWndTest != NULL )
if( pWndPermanentPT != NULL
&& ::IsChild( pPopup->m_hWnd, hWndPT )
&& pWndPermanentPT->IsKindOf( RUNTIME_CLASS(CScrollBar) )
)
return 1; // eat!
} // for( ; pPopup != NULL; pPopup = pPopup->m_pWndParentMenu )
} // if( hWndPT != NULL )
if( pDefInstancePopup != NULL )
{
bool bEatEvent = false;
ASSERT_VALID( pDefInstancePopup );
ASSERT( ::IsWindow(pDefInstancePopup->GetSafeHwnd()) );
if( bSameToolBarButtonIsClicked )
bEatEvent = true;
pDefInstancePopup->_CancelingSet();
pDefInstancePopup->_OnCancelMode();
if( ! bEatEvent )
{
if( wParam != WM_LBUTTONDOWN
&& wParam != WM_RBUTTONDOWN
&& wParam != WM_MBUTTONDOWN
)
bEatEvent = true;
}
if( ! bEatEvent )
{
if( ! ::IsWindow( hWndPT ) )
bEatEvent = true;
}
if( bEatEvent )
{
if( CExtPopupMenuWnd::g_bEatNcAreaClicks )
return 1; // eat!
}
} // if( pDefInstancePopup != NULL )
// else
// CExtPopupMenuSite::g_DefPopupMenuSite._Done();
}
break;
//default:
// return 1; // eat!
} // switch( wParam )
} // if( pWndCapture != NULL ....
else
return 1; // eat
} // if( (! g_DefPopupMenuSite.IsEmpty() ) ...
return
::CallNextHookEx(
g_DefPopupMenuSite.m_hMouseHook,
nCode,
wParam,
lParam
);
}