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 » Task main frame change it size Collapse All
Subject Author Date
Gevork Odabashyan Dec 4, 2009 - 7:51 AM

Dear support,

with version 2.8.7 we have new problem with task main frame.

We used ’FormulaGrid’ sample  from url: http://www.prof-uis.com/download/samples/win32/FormulaGrid.zip

and Windows XP SP3.

To reproduced problem we used the next steps:

- Expand task main frame on full main monitor.

- When Outlook Express adds icon to system tray to notify about new message, task main frame change it size. It first switch to not maximized state and then again expands to maximized state.

  The second method to reproduced bug - block current session (Ctrl+Alt+Del, Enter) and then unblock it.

  Also the same problem some times appears with  activating  ’Quick lunch’ on task bar, but in this case the bug reproducing  not stable.

Currently we must release our product, so can you supply us with the work around for this bug?   

Gevork Odabashyan Dec 11, 2009 - 2:18 AM

It’s not the multimonitor problem.


The problem with the next method of the CExtNcFrameImpl class:


bool CExtNcFrameImpl::NcFrameImpl_PreWindowProc( LRESULT & lResult, UINT message, WPARAM wParam, LPARAM lParam )


{      ....................


case WM_SETTINGCHANGE:

        NcFrameImpl_MapHtRects_Clean();

        if( ! NcFrameImpl_IsSupported() )

            break;

        if( NcFrameImpl_IsDwmBased() )

            break;

        if( wParam == SPI_SETWORKAREA )

        {

            WINDOWPLACEMENT _wp;

            ::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );

            _wp.length = sizeof(WINDOWPLACEMENT);

            if( GetWindowPlacement( _wp ) && _wp.showCmd == SW_SHOWMAXIMIZED )

            {

                CExtPaintManager::monitor_parms_t _mp;

                CExtPaintManager::stat_GetMonitorParms( _mp, pWndFrameImpl );

                WINDOWPLACEMENT _wpAdjust;

                ::memcpy( &_wpAdjust, &_wp, sizeof(WINDOWPLACEMENT) );

                _wpAdjust.showCmd = SW_SHOWNORMAL; // SW_RESTORE;

//                pWndFrameImpl->GetWindowRect( &_wpAdjust.rcNormalPosition );

                ::CopyRect( &_wpAdjust.rcNormalPosition, &_mp.m_rcWorkArea );

                _wpAdjust.ptMaxPosition.x = _wpAdjust.ptMaxPosition.x = _wpAdjust.rcNormalPosition.left;

                _wpAdjust.ptMaxPosition.y = _wpAdjust.ptMaxPosition.y = _wpAdjust.rcNormalPosition.top;

                SetWindowPlacement( _wpAdjust );

                SetWindowPlacement( _wp );

                //NcFrameImpl_RecalcNcFrame();

            }

        }


}


Currently I override this method in CMainFrame:


bool CMainFrame::NcFrameImpl_PreWindowProc( LRESULT & lResult, UINT message, WPARAM wParam, LPARAM lParam )

{

    if  (message != WM_SETTINGCHANGE)

    {

        return CExtNCW<CMDIFrameWnd>::NcFrameImpl_PreWindowProc( lResult, message, wParam, lParam );

    }

    return TRUE;

}


This fix bug.


Is this correct work around, or you can provide  one another?


 

Gevork Odabashyan Dec 10, 2009 - 8:34 AM

The problem with CExtNCW.


See previouse addition for our bug request.

Gevork Odabashyan Dec 10, 2009 - 8:30 AM

The problem with  CExtNCW class.


See addition for our request.

Gevork Odabashyan Dec 10, 2009 - 8:27 AM

It’s the problem with CExtNCW<> class.


If we remove CExtNCW <> from the CMainFrame class  definition in ’FormulaGrid’ sample:


class CMainFrame : public CExtNCW < CFrameWnd >     ---->    class CMainFrame : public  CFrameWnd


the bug will be fixed.


In opposit side  "ProfStudio" sample work correct.


 


 


 

Technical Support Dec 8, 2009 - 10:57 AM

We confirm this issue. It happens on multi monitor systems only and only if monitors have different screen resolutions. But we reproduced it only with using the Win+L key combinations. We were unable to reproduce it using any other actions you described in your message. We are working on the fix.

Gevork Odabashyan Dec 11, 2009 - 7:10 AM

Attention!

The bug reproduced on ProfStudio sample builded from 2.87 release sample sources.

If download ProfStudio sample from you site the bug not reproduced.

Maybe its help to fix the bug.

We need to get work around for this bug in the short time!

Gevork Odabashyan Dec 11, 2009 - 6:32 AM

It’s not the multimonitor problem.


 


The problem with the next method of the CExtNcFrameImpl class:




 


bool CExtNcFrameImpl::NcFrameImpl_PreWindowProc( LRESULT & lResult, UINT message, WPARAM wParam, LPARAM lParam )


 


{      ....................


 


case WM_SETTINGCHANGE:



        NcFrameImpl_MapHtRects_Clean();



        if( ! NcFrameImpl_IsSupported() )



            break;



        if( NcFrameImpl_IsDwmBased() )



            break;



        if( wParam == SPI_SETWORKAREA )



        {



            WINDOWPLACEMENT _wp;



            ::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );



            _wp.length = sizeof(WINDOWPLACEMENT);



            if( GetWindowPlacement( _wp ) && _wp.showCmd == SW_SHOWMAXIMIZED )



            {



                CExtPaintManager::monitor_parms_t _mp;



                CExtPaintManager::stat_GetMonitorParms( _mp, pWndFrameImpl );



                WINDOWPLACEMENT _wpAdjust;



                ::memcpy( &_wpAdjust, &_wp, sizeof(WINDOWPLACEMENT) );



                _wpAdjust.showCmd = SW_SHOWNORMAL; // SW_RESTORE;



//                pWndFrameImpl->GetWindowRect( &_wpAdjust.rcNormalPosition );



                ::CopyRect( &_wpAdjust.rcNormalPosition, &_mp.m_rcWorkArea );



                _wpAdjust.ptMaxPosition.x = _wpAdjust.ptMaxPosition.x = _wpAdjust.rcNormalPosition.left;



                _wpAdjust.ptMaxPosition.y = _wpAdjust.ptMaxPosition.y = _wpAdjust.rcNormalPosition.top;



                SetWindowPlacement( _wpAdjust );



                SetWindowPlacement( _wp );



                //NcFrameImpl_RecalcNcFrame();



            }



        }


 


}


 


Currently I override this method in CMainFrame:


 


bool CMainFrame::NcFrameImpl_PreWindowProc( LRESULT & lResult, UINT message, WPARAM wParam, LPARAM lParam )



{



    if  (message != WM_SETTINGCHANGE)



    {



        return CExtNCW<CMDIFrameWnd>::NcFrameImpl_PreWindowProc( lResult, message, wParam, lParam );



    }



    return TRUE;



}


 


This fix bug.


 


Is this correct work around, or you can provide  one another?