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 General Discussion » MDI child windows are unresponsive Collapse All
Subject Author Date
Joachim Hartmann Dec 8, 2006 - 2:02 AM

Hi

I’m using the free version of PROF-UIS.

The problem:
When I use the new themes from Office2007 (rc1 up tp rc3..all versions) I often get unresponsive mdi child windows.
It’s as if mouse move msgs are lost somewhere...They (mdi child wnds) are unresponsive to mouse move.
If i resize the child window is starts to work again.
I find the problem in all the versions of PROF UIS that I’ve used.
If I use standard themes such as XP and Office2003 the problem does not occur.
The problem occurs with Visual Studio 2003 and 2005

How to reproduce:
Open the MDI-m.exe sample application (from free version).
Close all the toolbar windows, they are not needed.
Open 2 mdi child windows, make them overlap each other.
Move the mainframe wnd. Then try to move the topmost mdi child window (you may have to retry moving the mainframe several times)
I have no trouble reproducing the problem (usually takes 3-5 attempts moving mainframe)

Other information: (which may not be relevant)
My PC has 2 cpu’s (not multicore)
WindowsXP sp2

/Joachim

Technical Support Dec 9, 2006 - 12:16 PM

Thank you for reporting the bug. To fix it, please update the source code for the CExtNcFrameImpl::NcFrameImpl_PostWindowProc() method in the ..\Prof-UIS\Src\ExtNcFrame.cpp file:

void CExtNcFrameImpl::NcFrameImpl_PostWindowProc( LRESULT & lResult, UINT message, WPARAM wParam, LPARAM lParam )
{
    lResult;
    switch( message )
    {
     case WM_NCPAINT:
        if( NcFrameImpl_IsDwmCaptionReplacement() && m_pNcFrameImplBridge != NULL )
        {
            HWND hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
            if( hWnd != NULL && ::IsWindow( hWnd ) )
            {
                CWnd * pWndFrameImpl = (CWnd *)NcFrameImpl_GetFrameWindow();
                ASSERT_VALID( pWndFrameImpl );
                CWindowDC dcWnd( pWndFrameImpl );
                CRect rcWnd, rcClient;
                pWndFrameImpl->GetWindowRect( &rcWnd );
                pWndFrameImpl->GetClientRect( &rcClient );
                pWndFrameImpl->ClientToScreen( &rcClient );
                rcClient.OffsetRect( -rcWnd.TopLeft() );
                rcWnd.OffsetRect( -rcWnd.TopLeft() );
                dcWnd.ExcludeClipRect( &rcClient );
                CExtMemoryDC dc( &dcWnd, &rcWnd );
                dc.FillSolidRect( &rcWnd, RGB(0,0,0) );
                CPoint ptViewPortOffset(
                    ::GetSystemMetrics( SM_CXSIZEFRAME ),
                    ::GetSystemMetrics( SM_CYCAPTION )
                        - NcFrameImpl_GetPM()->NcFrame_GetCaptionHeight( true, pWndFrameImpl )
                        + ::GetSystemMetrics( SM_CYSIZEFRAME )
                    );
                dc.OffsetViewportOrg( ptViewPortOffset.x, ptViewPortOffset.y );
                ::SendMessage( hWnd, WM_PRINTCLIENT, WPARAM(dc.m_hDC), PRF_CLIENT );
                dc.OffsetViewportOrg( -ptViewPortOffset.x, -ptViewPortOffset.y );
            }
        }
     break;
    case WM_PRINT:
    case WM_PRINTCLIENT:
        {
            CWnd * pWndFrameImpl = (CWnd *)NcFrameImpl_GetFrameWindow();
            ASSERT_VALID( pWndFrameImpl );
            CDC dc;
            dc.Attach( (HDC)wParam );
            CRect rcRgnWnd, rcRgnClient;
            pWndFrameImpl->GetWindowRect( &rcRgnWnd );
            pWndFrameImpl->GetClientRect( &rcRgnClient );
 
            if(     (lParam&PRF_NONCLIENT) != 0
                &&  NcFrameImpl_IsSupported()
                &&  ( ! NcFrameImpl_IsDwmBased() )
                )
            {
                CRect rcWnd = rcRgnWnd, rcClient = rcRgnClient;
                pWndFrameImpl->ClientToScreen( &rcClient );
                rcClient.OffsetRect( -rcWnd.TopLeft() );
                rcWnd.OffsetRect( -rcWnd.TopLeft() );
                CRgn rgnWnd;
                if( rgnWnd.CreateRectRgnIndirect(&rcWnd) )
                    dc.SelectClipRgn( &rgnWnd );
                dc.ExcludeClipRect( &rcClient );
                NcFrameImpl_OnNcPaint( dc );
                dc.SelectClipRgn( NULL );
            }
            if( (lParam&PRF_CHILDREN) != 0 )
                CExtPaintManager::stat_PrintChildren(
                    pWndFrameImpl->m_hWnd,
                    message,
                    dc.GetSafeHdc(),
                    lParam,
                    false
                    );
            dc.Detach();
        }
    break;
    case WM_NCLBUTTONDBLCLK:
        if( NcFrameImpl_IsDwmBased() )
            break;
        if( m_bNcFrameImpl_RestoreBorder )
        {
            m_bNcFrameImpl_RestoreBorder = false;
            CWnd * pWndFrameImpl = NcFrameImpl_GetFrameWindow();
            pWndFrameImpl->ModifyStyle( WS_BORDER, 0 );
        }
    break;
    case WM_WINDOWPOSCHANGING:
        if( NcFrameImpl_IsDwmBased() )
            break;
        {
            LPWINDOWPOS lpWindowPos = 
                reinterpret_cast < LPWINDOWPOS > (lParam);
            ASSERT( lpWindowPos != NULL );
            m_bNcFrameImpl_DelatayedFrameRecalc =
                ( ( lpWindowPos->flags & SWP_FRAMECHANGED ) == 0 )
                    ? true : false;
            NcFrameImpl_SetupRgn( (WINDOWPOS *)lParam );
        }
    break;
    case WM_WINDOWPOSCHANGED:
        if( NcFrameImpl_IsDwmBased() )
            break;
        m_bNcFrameImpl_DelatayedFrameRecalc = false;
    break;
    case WM_SIZE:
        NcFrameImpl_MapHtRects_Clean();
        if( NcFrameImpl_IsDwmCaptionReplacement() )
            NcFrameImpl_RecalcNcFrame();
        else if( ! NcFrameImpl_IsDwmBased() )
        {
            CWnd * pWndFrameImpl = NcFrameImpl_GetFrameWindow();
            if( (pWndFrameImpl->GetExStyle()&WS_EX_LAYOUTRTL) != 0 )
            {
                m_bNcFrameImpl_DelatayedFrameRecalc = false;
                NcFrameImpl_SetupRgn( NULL );
            }
        }
    break;
    case WM_GETMINMAXINFO:
        if( NcFrameImpl_IsSupported() )
        {
            LPMINMAXINFO pMMI = (LPMINMAXINFO)lParam;
            ASSERT( pMMI != NULL );
            VERIFY( NcFrameImpl_GetMinMaxInfo( pMMI ) );
        }
    break;
    case WM_CAPTURECHANGED:
        if( NcFrameImpl_IsSupported() )
        {
            CWnd * pWndFrameImpl = NcFrameImpl_GetFrameWindow();
            if( pWndFrameImpl->GetSafeHwnd() != NULL )
            {
                ASSERT_VALID( pWndFrameImpl );
                HWND hWndCapture = (HWND)lParam;
                if( hWndCapture != pWndFrameImpl->m_hWnd )
                {
                    HWND hWndMdiClient = CExtControlBar::stat_FindMdiClientHWND( pWndFrameImpl->m_hWnd );
                    if( hWndMdiClient != NULL )
                    {
                        CRect rc;
                        ::GetWindowRect( hWndMdiClient, &rc );
                        pWndFrameImpl->ScreenToClient( &rc );
                        rc.right ++;
                        ::MoveWindow( hWndMdiClient, rc.left, rc.top, rc.Width(), rc.Height(), FALSE );
                        rc.right --;
                        ::MoveWindow( hWndMdiClient, rc.left, rc.top, rc.Width(), rc.Height(), FALSE );
                    }
                }
            }
        }
    break;
    }
}