Thank you for reporting the problem. To fix it, please modify the code of the CExtNCW template in ExtNcFrame.h as described below. Please find the following line
template < class _BTNCW >
and remove from this template the following code:
public:
virtual void OnUpdateFrameTitle( BOOL bAddToTitle )
{
HWND hWndOwn = GetSafeHwnd();
_BTNCW::OnUpdateFrameTitle( bAddToTitle );
if( hWndOwn != NULL && ::IsWindow( hWndOwn ) )
::SendMessage( hWndOwn, WM_NCPAINT, 0L, 0L );
}
virtual void OnUpdateFrameMenu( HMENU hMenuAlt )
{
HWND hWndOwn = GetSafeHwnd();
_BTNCW::OnUpdateFrameMenu( hMenuAlt );
if( hWndOwn != NULL && ::IsWindow( hWndOwn ) )
::SendMessage( hWndOwn, WM_NCPAINT, 0L, 0L );
}
Then add two new templates:
template < >
class CExtNCW < CFrameWnd >
: public CFrameWnd
, public CExtNcFrameImpl
{
public:
CExtNCW()
{
}
virtual ~CExtNCW()
{
}
virtual HWND NcFrameImpl_OnQueryHWND()
{
return GetSafeHwnd();
}
protected:
virtual void PreSubclassWindow()
{
CFrameWnd::PreSubclassWindow();
CExtNcFrameImpl::PreSubclassWindow();
}
virtual void PostNcDestroy()
{
CExtNcFrameImpl::PostNcDestroy();
CFrameWnd::PostNcDestroy();
}
virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam )
{
if( ! NcFrameImpl_IsSupported() )
return CFrameWnd::WindowProc( message, wParam, lParam );
HWND hWndOwn = m_hWnd;
LRESULT lResult = 0;
if( NcFrameImpl_PreWindowProc( lResult, message, wParam, lParam ) )
return lResult;
lResult = CFrameWnd::WindowProc( message, wParam, lParam );
if( ! ::IsWindow( hWndOwn ) )
return lResult;
if( CWnd::FromHandlePermanent(hWndOwn) == NULL )
return lResult;
NcFrameImpl_PostWindowProc( lResult, message, wParam, lParam );
return lResult;
}
public:
virtual void OnUpdateFrameTitle( BOOL bAddToTitle )
{
HWND hWndOwn = GetSafeHwnd();
CFrameWnd::OnUpdateFrameTitle( bAddToTitle );
if( hWndOwn != NULL && ::IsWindow( hWndOwn ) )
::SendMessage( hWndOwn, WM_NCPAINT, 0L, 0L );
}
virtual void OnUpdateFrameMenu( HMENU hMenuAlt )
{
HWND hWndOwn = GetSafeHwnd();
CFrameWnd::OnUpdateFrameMenu( hMenuAlt );
if( hWndOwn != NULL && ::IsWindow( hWndOwn ) )
::SendMessage( hWndOwn, WM_NCPAINT, 0L, 0L );
}
}; // class CExtNCW
template < >
class CExtNCW < CMDIFrameWnd >
: public CMDIFrameWnd
, public CExtNcFrameImpl
{
public:
CExtNCW()
{
}
virtual ~CExtNCW()
{
}
virtual HWND NcFrameImpl_OnQueryHWND()
{
return GetSafeHwnd();
}
protected:
virtual void PreSubclassWindow()
{
CMDIFrameWnd::PreSubclassWindow();
CExtNcFrameImpl::PreSubclassWindow();
}
virtual void PostNcDestroy()
{
CExtNcFrameImpl::PostNcDestroy();
CMDIFrameWnd::PostNcDestroy();
}
virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam )
{
if( ! NcFrameImpl_IsSupported() )
return CMDIFrameWnd::WindowProc( message, wParam, lParam );
HWND hWndOwn = m_hWnd;
LRESULT lResult = 0;
if( NcFrameImpl_PreWindowProc( lResult, message, wParam, lParam ) )
return lResult;
lResult = CMDIFrameWnd::WindowProc( message, wParam, lParam );
if( ! ::IsWindow( hWndOwn ) )
return lResult;
if( CWnd::FromHandlePermanent(hWndOwn) == NULL )
return lResult;
NcFrameImpl_PostWindowProc( lResult, message, wParam, lParam );
return lResult;
}
public:
virtual void OnUpdateFrameTitle( BOOL bAddToTitle )
{
HWND hWndOwn = GetSafeHwnd();
CMDIFrameWnd::OnUpdateFrameTitle( bAddToTitle );
if( hWndOwn != NULL && ::IsWindow( hWndOwn ) )
::SendMessage( hWndOwn, WM_NCPAINT, 0L, 0L );
}
virtual void OnUpdateFrameMenu( HMENU hMenuAlt )
{
HWND hWndOwn = GetSafeHwnd();
CMDIFrameWnd::OnUpdateFrameMenu( hMenuAlt );
if( hWndOwn != NULL && ::IsWindow( hWndOwn ) )
::SendMessage( hWndOwn, WM_NCPAINT, 0L, 0L );
}
}; // class CExtNCW