Professional UI Solutions
Site Map   /  Register
 
 

Forum

Please Log In to post a new message or reply to an existing one. If you are not registered, please register.

NOTE: Some forums may be read-only if you are not currently subscribed to our technical support services.

Forums » Prof-UIS Tech Support » CExtRibbon Bug Collapse All
Subject Author Date
tera tera Sep 3, 2008 - 8:48 PM

Hello.


I made a tool menu with __ECTN_TBB_SEPARATED_DROPDOWN.


The application does Assert of a menu in the following conditions when I touch it.

1, I choose tool menu.

2, I touch it in MenuA.

3, The application does Assert.




 

Technical Support Sep 22, 2008 - 12:12 PM

Thank you for reporting this issue. To fix it, 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;
            }
            break;
            case WM_MOUSEWHEEL:
            {
                  if(   CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->_OnMouseWheel( wParam, lParam ) )
                        return 1;
            }
            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;
            }
            break;
            }
      }
      if( nCode == HC_ACTION && (! g_DefPopupMenuSite.IsEmpty() ) && (! g_DefPopupMenuSite.IsShutdownMode() ) )
      {
            CExtPopupMenuWnd * pWndCapture = g_DefPopupMenuSite.GetCapture();
            if( pWndCapture != NULL && ::IsWindow( pWndCapture->GetSafeHwnd() ) )
            {
                  ASSERT_VALID( pWndCapture );
                  switch( wParam )
                  {
                  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;
                        }
                        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;
                        if( bNoEat )
                              return ::CallNextHookEx( g_DefPopupMenuSite.m_hMouseHook, nCode, wParam, lParam );
                        return 1;
                  }
                  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 );
                        if( hWndFromPoint != NULL )
                        {
                              LRESULT nHT = ::SendMessage( hWndFromPoint, WM_NCHITTEST, 0L, MAKELPARAM( lpMS->pt.x, lpMS->pt.y ) );
                              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 );
                                    }
                              }
                        }
                        CPoint ptSrc( lpMS->pt );
                        pWndCapture->ScreenToClient( &ptSrc );
                        bool bNoEat = false;
                        HWND hWndCapture = pWndCapture->GetSafeHwnd();
                        ASSERT( hWndCapture != NULL && ::IsWindow(hWndCapture) );
                        if(   pWndCapture->_OnMouseClick( (UINT)wParam, ptSrc, bNoEat ) )
                              return 1;
                        if( bNoEat )
                              return ::CallNextHookEx( g_DefPopupMenuSite.m_hMouseHook, nCode, wParam, lParam );
                        if( ! (::IsWindow(hWndCapture)) )
                              return 1;
                        CPoint pt( lpMS->pt );
                        HWND hWndPT = ::WindowFromPoint( pt );
                        if( hWndPT != NULL )
                        {
                              CWnd * pWndPermanentPT = CWnd::FromHandlePermanent( hWndPT );
                              CExtPopupMenuWnd * pPopup = pWndCapture;
                              for( ; pPopup != NULL; pPopup = pPopup->m_pWndParentMenu )
                              {
                                    CPoint ptClient( pt );
                                    pPopup->ScreenToClient( &ptClient );
                                    if( pPopup->_PtInWndArea(ptClient) )
                                          return 1;
                                    CExtPopupMenuTipWnd & _tipWnd = pPopup->GetTip();
                                    HWND hWndTest = _tipWnd.GetSafeHwnd();
                                    if( hWndTest != NULL )
                                    {
                                          if( hWndTest == hWndPT || ::IsChild( hWndTest, hWndPT ) )
                                                return 1;
                                    }
                                    if(         pWndPermanentPT != NULL
                                          &&    ::IsChild( pPopup->m_hWnd, hWndPT )
                                          &&    pWndPermanentPT->IsKindOf( RUNTIME_CLASS(CScrollBar) )
                                          )
                                          return 1;
                              }
                        }
                        CExtPopupMenuWnd * pPopup = CExtPopupMenuSite::g_DefPopupMenuSite.GetInstance();
                        if( pPopup != NULL )
                        {
                              ASSERT_VALID( pPopup );
                              ASSERT( ::IsWindow(pPopup->GetSafeHwnd()) );
                              pPopup->_CancelingSet();
                              pPopup->_OnCancelMode();
                              bool bEatEvent = false;
                              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;
                              }
                        }
                  }
                  break;
                  }
            }
            else
                  return 1;
      }
      return ::CallNextHookEx( g_DefPopupMenuSite.m_hMouseHook, nCode, wParam, lParam );
}

tera tera Sep 8, 2008 - 5:54 PM

Hello.


 


I ask for your answer.

Technical Support Sep 9, 2008 - 2:16 PM

How to reproduce this issue in our RibbonBar sample project? We suspect this issue depends on very specific menu initialization steps.

tera tera Sep 22, 2008 - 2:55 AM

 


Hello.


Assert occurs.

Because I made a sample, please try it.


http://ifreeta.dee.cc/20080922/RibbonBarMDI.lzh