void CKofDlgImpl::OnNcActivate( BOOL& bActive )
{
	//----------------------------------------
	// Stay active if WF_STAYACTIVE bit is on:
	//----------------------------------------
	if (m_Dlg.m_nFlags & WF_STAYACTIVE)
	{
		bActive = TRUE;
	}

	//--------------------------------------------------
	// But do not stay active if the window is disabled:
	//--------------------------------------------------
	if (!m_Dlg.IsWindowEnabled ())
	{
		bActive = FALSE;
	}

	if (IsOwnerDrawCaption ())
	{
		CMFCVisualManager::GetInstance()->OnNcActivate(&m_Dlg, bActive);
		m_Dlg.RedrawWindow (CRect (0, 0, 0, 0), NULL,
			RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW | RDW_NOCHILDREN);
	}
}
//****************************************************************************************
void CBCGPDlgImpl::OnActivate(UINT nState, CWnd* pWndOther)
{
	m_Dlg.m_nFlags &= ~WF_STAYACTIVE;

	//--------------------------------------------------
	// Determine if this window should be active or not:
	//--------------------------------------------------
	CWnd* pWndActive = (nState == WA_INACTIVE) ? pWndOther : &m_Dlg;
	if (pWndActive != NULL)
	{
		BOOL bStayActive = (pWndActive->GetSafeHwnd () == m_Dlg.GetSafeHwnd () ||
			pWndActive->SendMessage (WM_FLOATSTATUS, FS_SYNCACTIVE));

		if (bStayActive)
		{
			m_Dlg.m_nFlags |= WF_STAYACTIVE;
		}
	}
	else 
	{
		//------------------------------------------
		// Force painting on our non-client area....
		//------------------------------------------
		m_Dlg.SendMessage (WM_NCPAINT, 1);
	}

	if (nState == WA_INACTIVE && IsOwnerDrawCaption ())
	{
		m_Dlg.RedrawWindow(NULL, NULL, RDW_FRAME | RDW_UPDATENOW);
	} 
}
BOOL CKofDlgImpl::OnNcCalcSize( BOOL /*bCalcValidRects*/, NCCALCSIZE_PARAMS FAR* lpncsp )
{
	ASSERT (lpncsp != NULL);

	if ((m_Dlg.GetStyle () & WS_CAPTION) == 0)
	{
		m_bVisualManagerNCArea = FALSE;
	}

	if (IsOwnerDrawCaption ())
	{
		lpncsp->rgrc[0].top += GetCaptionHeight ();
	}

	return (m_Dlg.GetStyle () & WS_MAXIMIZE) == WS_MAXIMIZE && IsOwnerDrawCaption ();
}
void CKofDlgImpl::OnActivate( UINT nState, CWnd* pWndOther )
{
	pWndOther;
	if (nState == WA_INACTIVE && IsOwnerDrawCaption ())
	{
		m_Dlg.RedrawWindow(NULL, NULL, RDW_FRAME | RDW_UPDATENOW);
	} 
}
//*********************************************************************************************************
BOOL CBCGPDlgImpl::OnNcPaint ()
{
#ifndef _BCGSUITE_
	if (globalData.m_bInSettingsChange || !IsOwnerDrawCaption ())
	{
		return FALSE;
	}
#else
	if (!IsOwnerDrawCaption ())
	{
		return FALSE;
	}
#endif

	return visualManagerMFC->OnNcPaint (&m_Dlg,
		m_lstCaptionSysButtons, m_rectRedraw);
}
BOOL CKofDlgImpl::OnNcPaint()
{
	if (!IsOwnerDrawCaption())
	{
		return FALSE;
	}

	return CKofStyleHelper::GetInstance()->OnNcPaint(&m_Dlg, m_lstCaptionSysButtons, m_rectRedraw);
}
//*************************************************************************
void CBCGPDlgImpl::OnNcMouseMove(UINT /*nHitTest*/, CPoint point)
{
	if (!IsOwnerDrawCaption ())
	{
		return;
	}

	OnTrackCaptionButtons (point);
}
void CKofDlgImpl::OnNcMouseMove( UINT nHitTest, CPoint point )
{
	nHitTest;
	if (!IsOwnerDrawCaption())
	{
		return;
	}

	OnTrackCaptionButtons(point);
}
void CKofDlgImpl::OnMouseMove( CPoint point )
{
	if (!IsOwnerDrawCaption ())
	{
		return;
	}

	CPoint ptScreen = point;
	m_Dlg.ClientToScreen (&ptScreen);

	OnTrackCaptionButtons (ptScreen);
}
//*************************************************************************
void CBCGPDlgImpl::OnLButtonUp(CPoint /*point*/)
{
	if (!IsOwnerDrawCaption ())
	{
		return;
	}

	switch (m_nHitSysButton)
	{
	case HTCLOSE_BCG:
	case HTMAXBUTTON_BCG:
	case HTMINBUTTON_BCG:
#ifndef _BCGSUITE_
	case HTHELPBUTTON_BCG:
#endif
		{
			UINT nHot = m_nHotSysButton;
			UINT nHit = m_nHitSysButton;

			StopCaptionButtonsTracking ();

			if (nHot == nHit)
			{
				UINT nSysCmd = 0;

				switch (nHot)
				{
				case HTCLOSE_BCG:
					nSysCmd = SC_CLOSE;
					break;

				case HTMAXBUTTON_BCG:
					nSysCmd = 
						(m_Dlg.GetStyle () & WS_MAXIMIZE) == WS_MAXIMIZE ? SC_RESTORE : SC_MAXIMIZE;
					break;

				case HTMINBUTTON_BCG:
					nSysCmd = m_Dlg.IsIconic () ? SC_RESTORE : SC_MINIMIZE;
					break;

#ifndef _BCGSUITE_
				case HTHELPBUTTON_BCG:
					nSysCmd = SC_CONTEXTHELP;
					break;
#endif
				}

				m_Dlg.PostMessage (WM_SYSCOMMAND, nSysCmd);
			}
		}
	}
}
//********************************************************************************
void CBCGPDlgImpl::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)
{
	if (m_bWindowPosChanging)
	{
		return;
	}

	if (((lpwndpos->flags & SWP_NOSIZE) == 0 || (lpwndpos->flags & SWP_FRAMECHANGED)) && 
		(IsOwnerDrawCaption ()))
	{
		m_bWindowPosChanging = TRUE;

		m_bIsWindowRgn = visualManagerMFC->OnSetWindowRegion (
			&m_Dlg, CSize (lpwndpos->cx, lpwndpos->cy));

		m_bWindowPosChanging = FALSE;
	}
}
void CKofDlgImpl::OnWindowPosChanged( WINDOWPOS FAR* lpwndpos )
{
	if (m_bWindowPosChanging)
	{
		return;
	}

	if (((lpwndpos->flags & SWP_NOSIZE) == 0 || (lpwndpos->flags & SWP_FRAMECHANGED)) && 
		(IsOwnerDrawCaption ()))
	{
		m_bWindowPosChanging = TRUE;

		m_bIsWindowRgn = CKofStyleHelper::GetInstance()->OnSetWindowRegion (
			&m_Dlg, CSize (lpwndpos->cx, lpwndpos->cy));

		m_bWindowPosChanging = FALSE;
	}
}
BOOL CKofDlgImpl::PreTranslateMessage( MSG* pMsg )
{
	switch (pMsg->message)
	{
		case WM_NCRBUTTONUP:
			if (pMsg->message == WM_NCRBUTTONUP && pMsg->hwnd == m_Dlg.GetSafeHwnd () && IsOwnerDrawCaption ())
			{
				CPoint pt (AFX_GET_X_LPARAM(pMsg->lParam), AFX_GET_Y_LPARAM(pMsg->lParam));

				UINT nHit = OnNcHitTest (pt);

				if (nHit == HTCAPTION || nHit == HTSYSMENU)
				{
					CMenu* pMenu = m_Dlg.GetSystemMenu (FALSE);
					if (pMenu->GetSafeHmenu () != NULL && ::IsMenu (pMenu->GetSafeHmenu ()))
					{
						/*UINT uiRes = ::TrackPopupMenu (pMenu->GetSafeHmenu(), TPM_LEFTBUTTON | TPM_RETURNCMD, 
							pt.x, pt.y, 0, m_Dlg.GetSafeHwnd (), NULL);*/

						UINT uiRes = 0;
						if (((CWinAppEx*)AfxGetApp())->GetContextMenuManager() != NULL)
						{
							((CWinAppEx*)AfxGetApp())->GetContextMenuManager()->ShowPopupMenu(pMenu->GetSafeHmenu(), pt.x, pt.y, &m_Dlg, TRUE);
						} 
						else
						{
							uiRes = ::TrackPopupMenu (pMenu->GetSafeHmenu(), TPM_LEFTBUTTON | TPM_RETURNCMD, 
								pt.x, pt.y, 0, m_Dlg.GetSafeHwnd (), NULL);
						}

						if (uiRes != 0)
						{
							m_Dlg.SendMessage (WM_SYSCOMMAND, uiRes);
							return TRUE;
						}
					}

				}
			}
			break;
	}

	return FALSE;
}
void CKofDlgImpl::OnChangeVisualManager()
{
	if (m_Dlg.GetSafeHwnd () == NULL)
	{
		return;
	}

	CRect rectWindow;
	m_Dlg.GetWindowRect (rectWindow);

	BOOL bZoomed = m_Dlg.IsZoomed ();

	if (IsOwnerDrawCaption ())
	{
		BOOL bChangeBorder = FALSE;

		if ((m_Dlg.GetStyle () & WS_BORDER) == WS_BORDER && m_bHasBorder)
		{
			bChangeBorder = TRUE;
			m_bWindowPosChanging = TRUE;
			m_Dlg.ModifyStyle (WS_BORDER, 0, SWP_FRAMECHANGED);
			m_bWindowPosChanging = FALSE;
		}

		m_bIsWindowRgn = CKofStyleHelper::GetInstance()->OnSetWindowRegion (
			&m_Dlg, rectWindow.Size ());

		if (bZoomed && bChangeBorder)
		{
			m_Dlg.ShowWindow (SW_MINIMIZE);
			m_Dlg.ShowWindow (SW_MAXIMIZE);
		}
	}
	else
	{
		BOOL bChangeBorder = FALSE;

		if ((m_Dlg.GetStyle () & WS_BORDER) == 0 && m_bHasBorder)
		{
			bChangeBorder = TRUE;
			m_bWindowPosChanging = TRUE;
			m_Dlg.ModifyStyle (0, WS_BORDER, SWP_FRAMECHANGED);
			m_bWindowPosChanging = FALSE;
		}

		if (m_bIsWindowRgn)
		{
			m_bIsWindowRgn = FALSE;
			m_Dlg.SetWindowRgn (NULL, TRUE);
		}

		if (bZoomed && bChangeBorder)
		{
			NCCALCSIZE_PARAMS params;
			ZeroMemory(&params, sizeof (NCCALCSIZE_PARAMS));
			params.rgrc[0].left   = rectWindow.left;
			params.rgrc[0].top    = rectWindow.top;
			params.rgrc[0].right  = rectWindow.right;
			params.rgrc[0].bottom = rectWindow.bottom;

			m_Dlg.CalcWindowRect (&params.rgrc[0], CFrameWnd::adjustBorder);

			if ((m_Dlg.GetStyle () & WS_CAPTION) == WS_CAPTION)
			{
				params.rgrc[0].top += GetCaptionHeight ();
			}

			m_Dlg.SetWindowPos (NULL, params.rgrc[0].left, params.rgrc[0].top, 
				params.rgrc[0].right - params.rgrc[0].left, params.rgrc[0].bottom - params.rgrc[0].top,
				SWP_NOACTIVATE | SWP_NOZORDER);
		}
		else
		{
			m_Dlg.SetWindowPos (NULL, -1, -1, rectWindow.Width () + 1, rectWindow.Height () + 1,
				SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
			m_Dlg.SetWindowPos (NULL, -1, -1, rectWindow.Width (), rectWindow.Height (),
				SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
		}
	}

	UpdateCaption ();
	UpdateCaptionButtons();
}
//********************************************************************************
int CBCGPDlgImpl::OnCreate()
{
	if (m_pLayout == NULL)
	{
		return 0;
	}

	ASSERT_VALID(m_pLayout);

	if (!m_pLayout->Create(&m_Dlg))
	{
		delete m_pLayout;
		m_pLayout = NULL;
		return -1;
	}

	if (globalData.m_bIsRTL)
	{
		m_Dlg.ModifyStyleEx (0, WS_EX_LAYOUTRTL);
	}

	const DWORD dwStyle = m_Dlg.GetStyle ();

	if (dwStyle & WS_CHILD)
	{
		m_bResizeBox = FALSE;
	}

	CBCGPDialog* pDialog = DYNAMIC_DOWNCAST(CBCGPDialog, &m_Dlg);
	CBCGPPropertySheet* pPropSheet = DYNAMIC_DOWNCAST(CBCGPPropertySheet, &m_Dlg);

	if (pDialog != NULL || pPropSheet != NULL)
	{
		if ((dwStyle & WS_CHILD) != WS_CHILD)
		{
			CRect rect;
			m_Dlg.GetClientRect(&rect);

			m_Dlg.ModifyStyle(DS_MODALFRAME, WS_POPUP | WS_THICKFRAME);

			::AdjustWindowRectEx(&rect, m_Dlg.GetStyle (), 
				::IsMenu(m_Dlg.GetMenu()->GetSafeHmenu()), m_Dlg.GetExStyle ());

			if (m_bVisualManagerNCArea && IsOwnerDrawCaption() && !globalData.DwmIsCompositionEnabled ())
			{
				int nHeight = ::GetSystemMetrics (SM_CYCAPTION);
				rect.top -= nHeight / 2;
				rect.bottom += nHeight - nHeight / 2;
			}

			m_Dlg.SetWindowPos(NULL, 0, 0, rect.Width(), rect.Height(), SWP_FRAMECHANGED | 
				SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOOWNERZORDER);

			if (pPropSheet == NULL)
			{
				m_Dlg.GetWindowRect (rect);
				m_LayoutMMI.ptMinTrackSize.x = rect.Width ();
				m_LayoutMMI.ptMinTrackSize.y = rect.Height ();
			}
		}
	}

	if (pPropSheet == NULL && DYNAMIC_DOWNCAST(CBCGPPropertyPage, &m_Dlg) == NULL)
	{
		CRect rect;
		m_Dlg.GetClientRect (rect);
		m_pLayout->SetMinSize (rect.Size ());
	}

	return 0;
}
UINT CKofDlgImpl::OnNcHitTest( CPoint point )
{
	m_Dlg.ScreenToClient (&point);

	if (!m_rectResizeBox.IsRectEmpty ())
	{
		if (m_rectResizeBox.PtInRect(point))
		{
			BOOL bRTL = m_Dlg.GetExStyle() & WS_EX_LAYOUTRTL;
			return bRTL ? HTBOTTOMLEFT : HTBOTTOMRIGHT;
		}
	}

	if (!IsOwnerDrawCaption ())
	{
		return HTNOWHERE;
	}

	const CSize szSystemBorder(::GetSystemMetrics (SM_CXSIZEFRAME), ::GetSystemMetrics (SM_CYSIZEFRAME));

	int cxOffset = szSystemBorder.cx;
	int cyOffset = szSystemBorder.cy;
	if (!m_Dlg.IsIconic ())
	{
		cyOffset += GetCaptionHeight ();
	}

	if (m_Dlg.IsZoomed ())
	{
		cxOffset -= szSystemBorder.cx;
		cyOffset -= szSystemBorder.cy;
	}

	point.Offset (cxOffset, cyOffset);

	for (POSITION pos = m_lstCaptionSysButtons.GetHeadPosition (); pos != NULL;)
	{
		CMFCCaptionButtonEx* pButton = (CMFCCaptionButtonEx*)
			m_lstCaptionSysButtons.GetNext (pos);
		ASSERT_VALID (pButton);

		if (pButton->GetRect ().PtInRect (point))
		{
			return pButton->m_nHit;
		}
	}

	CRect rectCaption = GetCaptionRect ();
	if (rectCaption.PtInRect (point))
	{
		if ((m_Dlg.GetExStyle () & WS_EX_TOOLWINDOW) == 0)
		{
			CRect rectSysMenu = rectCaption;
			rectSysMenu.right = rectSysMenu.left + ::GetSystemMetrics (SM_CXSMICON) + 2 +
				(m_Dlg.IsZoomed () ? szSystemBorder.cx : 0);

			return rectSysMenu.PtInRect (point) ? HTSYSMENU : HTCAPTION;
		}

		return HTCAPTION;
	}

	return HTNOWHERE;
}
//**************************************************************************************
BOOL CBCGPDlgImpl::PreTranslateMessage(MSG* pMsg) 
{
	switch (pMsg->message)
	{
	case WM_SYSKEYDOWN:
	case WM_CONTEXTMENU:
		if (CBCGPPopupMenu::GetActiveMenu() != NULL &&
			::IsWindow (CBCGPPopupMenu::GetActiveMenu()->m_hWnd) &&
			pMsg->wParam == VK_MENU)
		{
			CBCGPPopupMenu::GetActiveMenu()->SendMessage (WM_CLOSE);
			return TRUE;
		}
		break;

	case WM_SYSKEYUP:
		if (CBCGPPopupMenu::GetActiveMenu() != NULL &&
			::IsWindow (CBCGPPopupMenu::GetActiveMenu()->m_hWnd))
		{
			return TRUE;	// To prevent system menu opening
		}
		break;

	case WM_KEYDOWN:
		//-----------------------------------------
		// Pass keyboard action to the active menu:
		//-----------------------------------------
		if (CBCGPPopupMenu::GetActiveMenu() != NULL &&
			::IsWindow (CBCGPPopupMenu::GetActiveMenu()->m_hWnd))
		{
			CBCGPPopupMenu::GetActiveMenu()->SendMessage (WM_KEYDOWN, (int) pMsg->wParam);
			return TRUE;
		}

#ifndef BCGP_EXCLUDE_RIBBON
#ifndef _BCGSUITE_
		if (m_bBackstageMode && (pMsg->wParam == VK_HOME || pMsg->wParam == VK_ESCAPE))
		{
			for (CWnd* pWndParent = m_Dlg.GetParent(); pWndParent != NULL; pWndParent = pWndParent->GetParent())
			{
				CBCGPRibbonBackstageView* pView = DYNAMIC_DOWNCAST(CBCGPRibbonBackstageView, pWndParent);
				if (pView != NULL)
				{
					if (pMsg->wParam == VK_HOME)
					{
						#define MAX_CLASS_NAME		255
						#define EDIT_CLASS			_T("Edit")

						TCHAR lpszClassName [MAX_CLASS_NAME + 1];

						if (CWnd::GetFocus()->GetSafeHwnd() != NULL)
						{
							::GetClassName (CWnd::GetFocus()->GetSafeHwnd (), lpszClassName, MAX_CLASS_NAME);
							CString strClass = lpszClassName;

							if (strClass == EDIT_CLASS)
							{
								return FALSE;
							}
						}

						pView->SetFocus();
					}
					else	// Escape
					{
						pView->SendMessage(WM_CLOSE);
					}
					return TRUE;
				}
			}
			return TRUE;
		}
#endif
#endif
		break;

	case WM_LBUTTONDOWN:
	case WM_RBUTTONDOWN:
	case WM_RBUTTONUP:
	case WM_MBUTTONDOWN:
	case WM_MBUTTONUP:
		{
			CPoint pt (BCG_GET_X_LPARAM(pMsg->lParam), BCG_GET_Y_LPARAM(pMsg->lParam));
			CWnd* pWnd = CWnd::FromHandle (pMsg->hwnd);

			if (pWnd != NULL && ::IsWindow (pMsg->hwnd))
			{
				pWnd->ClientToScreen (&pt);
			}

			if (ProcessMouseClick (pt))
			{
				return TRUE;
			}

			if (!::IsWindow (pMsg->hwnd))
			{
				return TRUE;
			}
		}
		break;

	case WM_NCLBUTTONDOWN:
	case WM_NCLBUTTONUP:
	case WM_NCRBUTTONDOWN:
	case WM_NCRBUTTONUP:
	case WM_NCMBUTTONDOWN:
	case WM_NCMBUTTONUP:
		if (ProcessMouseClick (CPoint (BCG_GET_X_LPARAM(pMsg->lParam), BCG_GET_Y_LPARAM(pMsg->lParam))))
		{
			return TRUE;
		}

		if (pMsg->message == WM_NCRBUTTONUP && pMsg->hwnd == m_Dlg.GetSafeHwnd () && IsOwnerDrawCaption ())
		{
			CPoint pt (BCG_GET_X_LPARAM(pMsg->lParam), BCG_GET_Y_LPARAM(pMsg->lParam));

			UINT nHit = OnNcHitTest (pt);

			if (nHit == HTCAPTION || nHit == HTSYSMENU)
			{
				CMenu* pMenu = m_Dlg.GetSystemMenu (FALSE);
				if (pMenu->GetSafeHmenu () != NULL && ::IsMenu (pMenu->GetSafeHmenu ()))
				{
					UINT uiRes = ::TrackPopupMenu (pMenu->GetSafeHmenu(), TPM_LEFTBUTTON | TPM_RETURNCMD, 
						pt.x, pt.y, 0, m_Dlg.GetSafeHwnd (), NULL);

					if (uiRes != 0)
					{
						m_Dlg.SendMessage (WM_SYSCOMMAND, uiRes);
						return TRUE;
					}
				}

			}
		}
		break;

	case WM_MOUSEWHEEL:
		if (CBCGPPopupMenu::GetActiveMenu() != NULL &&
			::IsWindow (CBCGPPopupMenu::GetActiveMenu()->m_hWnd) &&
			CBCGPPopupMenu::GetActiveMenu()->IsScrollable ())
		{
			CBCGPPopupMenu::GetActiveMenu()->SendMessage (WM_MOUSEWHEEL,
				pMsg->wParam, pMsg->lParam);

		}
#ifndef BCGP_EXCLUDE_RIBBON
#ifndef _BCGSUITE_
		else
		{
			CPoint ptCursor;
			::GetCursorPos (&ptCursor);

			CWnd* pWnd = CWnd::WindowFromPoint(ptCursor);

			CBCGPRibbonGalleryCtrl* pGalleryCtrl = DYNAMIC_DOWNCAST(CBCGPRibbonGalleryCtrl, pWnd);

			if (pGalleryCtrl != NULL)
			{
				pGalleryCtrl->SendMessage (WM_MOUSEWHEEL, pMsg->wParam, pMsg->lParam);
				return TRUE;
			}
		}
#endif
#endif
		break;

	case WM_MOUSEMOVE:
		{
			CPoint pt (BCG_GET_X_LPARAM(pMsg->lParam), BCG_GET_Y_LPARAM(pMsg->lParam));
			CWnd* pWnd = CWnd::FromHandle (pMsg->hwnd);

			if (pWnd != NULL)
			{
				pWnd->ClientToScreen (&pt);
			}

			if (ProcessMouseMove (pt))
			{
				return TRUE;
			}
		}
	}

	return FALSE;
}
void CKofDlgImpl::UpdateCaption()
{
	if (!IsOwnerDrawCaption ())
	{
		return;
	}

	if (m_lstCaptionSysButtons.IsEmpty ())
	{
		//------------------------
		// Create caption buttons:
		//------------------------
		const DWORD dwStyle = m_Dlg.GetStyle ();
		HMENU hSysMenu = NULL;
		CMenu* pSysMenu = m_Dlg.GetSystemMenu (FALSE);

		if (pSysMenu != NULL && ::IsMenu (pSysMenu->m_hMenu))
		{
			hSysMenu = pSysMenu->GetSafeHmenu ();
			if (!::IsMenu (hSysMenu) || (m_Dlg.GetStyle () & WS_SYSMENU) == 0)
			{
				hSysMenu = NULL;
			}
		}

		if (hSysMenu != NULL)
		{
			m_lstCaptionSysButtons.AddTail (new CMFCCaptionButtonEx (AFX_HTCLOSE));

			if ((dwStyle & WS_MAXIMIZEBOX) == WS_MAXIMIZEBOX)
			{
				m_lstCaptionSysButtons.AddTail (new CMFCCaptionButtonEx (AFX_HTMAXBUTTON));
			}

			if ((dwStyle & WS_MINIMIZEBOX) == WS_MINIMIZEBOX)
			{
				m_lstCaptionSysButtons.AddTail (new CMFCCaptionButtonEx (AFX_HTMINBUTTON));
			}

			if ((dwStyle & DS_CONTEXTHELP) == DS_CONTEXTHELP)
			{
				if (!m_Dlg.IsKindOf (RUNTIME_CLASS (CPropertySheet)))
				{
					m_lstCaptionSysButtons.AddTail (new CMFCCaptionButtonEx (AFX_HTMINBUTTON + 1));
				}
			}
		}
	}

	CRect rectCaption = GetCaptionRect ();

	{
		CSize sizeButton = CMFCVisualManager::GetInstance()->GetNcBtnSize (FALSE);
		sizeButton.cy = min (sizeButton.cy, rectCaption.Height () - 2);

		int x = rectCaption.right - sizeButton.cx;
		int y = rectCaption.top + max (0, (rectCaption.Height () - sizeButton.cy) / 2);

		for (POSITION pos = m_lstCaptionSysButtons.GetHeadPosition (); pos != NULL;)
		{
			CMFCCaptionButtonEx* pButton = (CMFCCaptionButtonEx*)
				m_lstCaptionSysButtons.GetNext (pos);
			ASSERT_VALID (pButton);

			pButton->SetRect (CRect (CPoint (x, y), sizeButton));

			x -= sizeButton.cx;
		}
	}

	m_Dlg.RedrawWindow (NULL, NULL,
		RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW | RDW_NOCHILDREN);
}
//*************************************************************************
void CBCGPDlgImpl::UpdateCaption ()
{
	if (!IsOwnerDrawCaption ())
	{
		return;
	}

	if (m_lstCaptionSysButtons.IsEmpty ())
	{
		//------------------------
		// Create caption buttons:
		//------------------------
		const DWORD dwStyle = m_Dlg.GetStyle ();
		HMENU hSysMenu = NULL;
		CMenu* pSysMenu = m_Dlg.GetSystemMenu (FALSE);

		if (pSysMenu != NULL && ::IsMenu (pSysMenu->m_hMenu))
		{
			hSysMenu = pSysMenu->GetSafeHmenu ();
			if (!::IsMenu (hSysMenu) || (m_Dlg.GetStyle () & WS_SYSMENU) == 0)
			{
				hSysMenu = NULL;
			}
		}

		if (hSysMenu != NULL)
		{
			m_lstCaptionSysButtons.AddTail (new CBCGPFrameCaptionButton (HTCLOSE_BCG));

			if ((dwStyle & WS_MAXIMIZEBOX) == WS_MAXIMIZEBOX)
			{
				m_lstCaptionSysButtons.AddTail (new CBCGPFrameCaptionButton (HTMAXBUTTON_BCG));
			}

			if ((dwStyle & WS_MINIMIZEBOX) == WS_MINIMIZEBOX)
			{
				m_lstCaptionSysButtons.AddTail (new CBCGPFrameCaptionButton (HTMINBUTTON_BCG));
			}

#ifndef _BCGSUITE_
			if ((dwStyle & DS_CONTEXTHELP) == DS_CONTEXTHELP)
			{
				if (!m_Dlg.IsKindOf (RUNTIME_CLASS (CPropertySheet)))
				{
					m_lstCaptionSysButtons.AddTail (new CBCGPFrameCaptionButton (HTHELPBUTTON_BCG));
				}
			}
#endif
		}
	}

	CRect rectCaption = GetCaptionRect ();

#ifndef _BCGSUITE_
    if (!visualManagerMFC->OnUpdateNcButtons(&m_Dlg, m_lstCaptionSysButtons, rectCaption))
#endif
    {
	    CSize sizeButton = visualManagerMFC->GetNcBtnSize (FALSE);
	    sizeButton.cy = min (sizeButton.cy, rectCaption.Height () - 2);

	    int x = rectCaption.right - sizeButton.cx;
	    int y = rectCaption.top + max (0, (rectCaption.Height () - sizeButton.cy) / 2);

	    for (POSITION pos = m_lstCaptionSysButtons.GetHeadPosition (); pos != NULL;)
	    {
		    CBCGPFrameCaptionButton* pButton = (CBCGPFrameCaptionButton*)
			    m_lstCaptionSysButtons.GetNext (pos);
		    ASSERT_VALID (pButton);

		    pButton->SetRect (CRect (CPoint (x, y), sizeButton));

		    x -= sizeButton.cx;
	    }
    }

#ifndef _BCGSUITE_
    m_Dlg.SendMessage (BCGM_ONAFTERUPDATECAPTION);
#endif

	m_Dlg.RedrawWindow (NULL, NULL,
		RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW | RDW_NOCHILDREN);
}