www.pudn.com > ÍøÂç¶Ë¿Ú¼àÊÓ.rar > Bcgglobals.cpp


//******************************************************************************* 
// COPYRIGHT NOTES 
// --------------- 
// This is a part of the BCGControlBar Library 
// Copyright (C) 1998-2000 BCGSoft Ltd. 
// All rights reserved. 
// 
// This source code can be used, distributed or modified 
// only under terms and conditions  
// of the accompanying license agreement. 
//******************************************************************************* 
 
#include "stdafx.h" 
#include "BCGCBPro.h" 
#include "bcgglobals.h" 
#include "BCGPVisualManager.h" 
#include "BCGPKeyboardManager.h" 
#include "MenuHash.h" 
#include "BCGPToolBar.h" 
#include "MenuImages.h" 
#include "BCGPMiniframeWnd.h" 
 
extern CObList	gAllToolbars; 
 
static const CString strOfficeFontName	= _T("Tahoma"); 
static const CString strDefaultFontName = _T("MS Sans Serif"); 
static const CString strVertFontName	= _T("Arial"); 
static const CString strMarlettFontName	= _T("Marlett"); 
 
static int CALLBACK FontFamalyProcFonts (const LOGFONT FAR* lplf, 
									const TEXTMETRIC FAR* /*lptm*/, 
									ULONG /*ulFontType*/, 
									LPARAM /*lParam*/) 
{ 
	ASSERT (lplf != NULL); 
 
	CString strFont = lplf->lfFaceName; 
	return strFont.CollateNoCase (strOfficeFontName) == 0 ? 0 : 1; 
} 
///////////////////////////////////////////////////////////////////////////// 
// Cached system metrics, etc 
 
BCGCBPRODLLEXPORT GLOBAL_DATA globalData; 
 
// Initialization code 
GLOBAL_DATA::GLOBAL_DATA() 
{ 
	//--------------------------------------------------------- 
	// Cached system values (updated in CWnd::OnSysColorChange) 
	//--------------------------------------------------------- 
	hbrBtnShadow = NULL; 
	hbrBtnHilite = NULL; 
	hbrWindow = NULL; 
 
	UpdateSysColors(); 
 
	m_hcurStretch = NULL; 
	m_hcurStretchVert = NULL; 
	m_hcurHand = NULL; 
	m_hcurSizeAll = NULL; 
	m_hiconTool = NULL; 
 
	UpdateFonts(); 
 
	//----------------------- 
	// Shell icon sizes: 
	//----------------------- 
	CoInitialize (NULL); 
	SHFILEINFO	sfi; 
	HIMAGELIST	hil = NULL; 
	hil	= (HIMAGELIST) ::SHGetFileInfo(_T(""), FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof sfi, SHGFI_SHELLICONSIZE | SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES); 
	if (hil != NULL) 
	{ 
		int	cxIcon, cyIcon; 
		VERIFY(ImageList_GetIconSize(hil, &cxIcon, &cyIcon)); 
		m_sizeSmallIcon.cx	= cxIcon; 
		m_sizeSmallIcon.cy	= cyIcon; 
	} 
	else 
	{ 
		m_sizeSmallIcon.cx	= ::GetSystemMetrics (SM_CXSMICON); 
		m_sizeSmallIcon.cy	= ::GetSystemMetrics (SM_CYSMICON); 
	} 
 
	CoUninitialize (); 
 
	//----------------------- 
	// Detect the kind of OS: 
	//----------------------- 
	OSVERSIONINFO osvi; 
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 
 
	::GetVersionEx (&osvi); 
	bIsWindowsNT4 = ((osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) && 
					(osvi.dwMajorVersion < 5)); 
 
	bIsWindows9x = (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS); 
 
	m_nDragFrameThiknessFloat = 4;  // pixels 
	m_nDragFrameThiknessDock = 3;   // pixels 
 
	m_nAutoHideToolBarSpacing = 14; // pixels 
	m_nAutoHideToolBarMargin  = 4;  // pixels 
 
	m_nCoveredMainWndClientAreaPercent = 50; // percents 
 
	m_hinstUXThemeDLL = NULL; 
 
	m_nMaxToolTipWidth = -1; 
} 
//******************************************************************************************* 
GLOBAL_DATA::~GLOBAL_DATA() 
{ 
	CleanUp (); 
} 
//************************************************************************************ 
void GLOBAL_DATA::UpdateFonts() 
{ 
	if (fontRegular.GetSafeHandle () != NULL) 
	{ 
		::DeleteObject (fontRegular.Detach ()); 
	} 
 
	if (fontTooltip.GetSafeHandle () != NULL) 
	{ 
		::DeleteObject (fontTooltip.Detach ()); 
	} 
 
	if (fontBold.GetSafeHandle () != NULL) 
	{ 
		::DeleteObject (fontBold.Detach ()); 
	} 
 
	if (fontUnderline.GetSafeHandle () != NULL) 
	{ 
		::DeleteObject (fontUnderline.Detach ()); 
	} 
 
	if (fontVert.GetSafeHandle () != NULL) 
	{ 
		::DeleteObject (fontVert.Detach ()); 
	} 
 
	if (fontVertCaption.GetSafeHandle () != NULL) 
	{ 
		::DeleteObject (fontVertCaption.Detach ()); 
	} 
 
	if (fontMarlett.GetSafeHandle () != NULL) 
	{ 
		::DeleteObject (fontMarlett.Detach ()); 
	} 
 
	//------------------ 
	// Initialize fonts: 
	//------------------ 
	NONCLIENTMETRICS info; 
	info.cbSize = sizeof(info); 
 
	::SystemParametersInfo (SPI_GETNONCLIENTMETRICS, sizeof(info), &info, 0); 
 
	LOGFONT lf; 
	memset (&lf, 0, sizeof (LOGFONT)); 
 
	CWindowDC dc (NULL); 
	lf.lfCharSet = (BYTE) GetTextCharsetInfo (dc.GetSafeHdc (), NULL, 0); 
 
	lf.lfHeight = info.lfMenuFont.lfHeight; 
	lf.lfWeight = info.lfMenuFont.lfWeight; 
	lf.lfItalic = info.lfMenuFont.lfItalic; 
 
	////////////////////////////////////////////// 
	// 	// Check if we should use system font 
	//-------------------------------------------- 
	_tcscpy (lf.lfFaceName, info.lfMenuFont.lfFaceName); 
 
	BOOL fUseSystemFont = (info.lfMenuFont.lfCharSet > SYMBOL_CHARSET); 
	if (!fUseSystemFont) 
	{ 
		//---------------------------------- 
		// Check for "Tahoma" font existance: 
		//---------------------------------- 
		if (::EnumFontFamilies (dc.GetSafeHdc (), NULL, FontFamalyProcFonts, 0) == 0) 
		{ 
			//--------------------------- 
			// Found! Use MS Office font! 
			//--------------------------- 
			_tcscpy (lf.lfFaceName, strOfficeFontName); 
		} 
		else 
		{ 
			//----------------------------- 
			// Not found. Use default font: 
			//----------------------------- 
			_tcscpy (lf.lfFaceName, strDefaultFontName); 
		} 
	} 
	//-------------------------------------------- 
	////////////////////////////////////////////// 
 
	fontRegular.CreateFontIndirect (&lf); 
 
	//--------------------- 
	// Create tooltip font: 
	//--------------------- 
	NONCLIENTMETRICS ncm; 
	memset (&ncm, 0, sizeof (NONCLIENTMETRICS)); 
	ncm.cbSize = sizeof (NONCLIENTMETRICS); 
 
	::SystemParametersInfo (SPI_GETNONCLIENTMETRICS, sizeof (NONCLIENTMETRICS), 
		&ncm, 0); 
 
	lf.lfItalic = ncm.lfStatusFont.lfItalic; 
	lf.lfWeight = ncm.lfStatusFont.lfWeight; 
	fontTooltip.CreateFontIndirect (&lf); 
 
	lf.lfItalic = info.lfMenuFont.lfItalic; 
	lf.lfWeight = info.lfMenuFont.lfWeight; 
 
	//------------------------- 
	// Create "underline" font: 
	//------------------------- 
	lf.lfUnderline = TRUE; 
	fontUnderline.CreateFontIndirect (&lf); 
	lf.lfUnderline = FALSE; 
 
	//------------------ 
	// Create bold font: 
	//------------------ 
	lf.lfWeight = FW_BOLD; 
	fontBold.CreateFontIndirect (&lf); 
 
	//--------------------- 
	// Create Marlett font: 
	//--------------------- 
	BYTE bCharSet = lf.lfCharSet; 
	lf.lfWeight = info.lfMenuFont.lfWeight; 
	lf.lfCharSet = SYMBOL_CHARSET; 
	lf.lfWeight = 0; 
	lf.lfHeight = ::GetSystemMetrics (SM_CYMENUCHECK) - 1; 
	_tcscpy (lf.lfFaceName, strMarlettFontName); 
 
	fontMarlett.CreateFontIndirect (&lf); 
 
	lf.lfCharSet = bCharSet;	// Restore charset 
 
	//---------------------- 
	// Create vertical font: 
	//---------------------- 
	CFont font; 
	if (font.CreateStockObject (DEFAULT_GUI_FONT)) 
	{ 
		if (font.GetLogFont (&lf) != 0) 
		{ 
			lf.lfOrientation = 900; 
			lf.lfEscapement = 2700; 
 
			lf.lfHeight = info.lfMenuFont.lfHeight; 
			lf.lfWeight = info.lfMenuFont.lfWeight; 
			lf.lfItalic = info.lfMenuFont.lfItalic; 
			 
			{ 
				_tcscpy (lf.lfFaceName, strVertFontName); 
			} 
			//-------------------------------------------- 
			////////////////////////////////////////////// 
 
			fontVert.CreateFontIndirect (&lf); 
 
			lf.lfEscapement = 900; 
			fontVertCaption.CreateFontIndirect (&lf); 
		} 
	} 
 
	UpdateTextMetrics(); 
 
	//------------------------------------- 
	// Notify toolbars about font changing: 
	//------------------------------------- 
	for (POSITION posTlb = gAllToolbars.GetHeadPosition (); posTlb != NULL;) 
	{ 
		CBCGPToolBar* pToolBar = (CBCGPToolBar*) gAllToolbars.GetNext (posTlb); 
		ASSERT (pToolBar != NULL); 
 
		if (CWnd::FromHandlePermanent (pToolBar->m_hWnd) != NULL) 
		{ 
			ASSERT_VALID(pToolBar); 
 
			pToolBar->OnGlobalFontsChanged (); 
		} 
	} 
} 
//******************************************************************************************* 
void GLOBAL_DATA::UpdateSysColors() 
{ 
	clrBarFace = clrBtnFace = ::GetSysColor(COLOR_BTNFACE); 
	clrBarShadow = clrBtnShadow = ::GetSysColor(COLOR_BTNSHADOW); 
	clrBarDkShadow = clrBtnDkShadow = ::GetSysColor(COLOR_3DDKSHADOW); 
	clrBarLight = clrBtnLight = ::GetSysColor(COLOR_3DLIGHT); 
	clrBarHilite = clrBtnHilite = ::GetSysColor(COLOR_BTNHIGHLIGHT); 
	clrBarText = clrBtnText = ::GetSysColor(COLOR_BTNTEXT); 
	clrGrayedText = ::GetSysColor (COLOR_GRAYTEXT); 
	clrWindowFrame = ::GetSysColor(COLOR_WINDOWFRAME); 
 
	clrHilite = ::GetSysColor(COLOR_HIGHLIGHT); 
	clrTextHilite = ::GetSysColor(COLOR_HIGHLIGHTTEXT); 
 
	clrBarWindow = clrWindow = ::GetSysColor (COLOR_WINDOW); 
	clrWindowText = ::GetSysColor (COLOR_WINDOWTEXT); 
 
	clrCaptionText = ::GetSysColor (COLOR_CAPTIONTEXT); 
	clrMenuText = ::GetSysColor (COLOR_MENUTEXT); 
 
	clrActiveCaption = ::GetSysColor (COLOR_ACTIVECAPTION); 
	clrInactiveCaption = ::GetSysColor (COLOR_INACTIVECAPTION); 
 
	clrActiveBorder = ::GetSysColor (COLOR_ACTIVEBORDER); 
	clrInactiveBorder = ::GetSysColor (COLOR_INACTIVEBORDER); 
 
	clrInactiveCaptionText = ::GetSysColor (COLOR_INACTIVECAPTIONTEXT); 
 
#ifdef COLOR_HOTLIGHT 
 
	OSVERSIONINFO osvi; 
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 
 
	::GetVersionEx (&osvi); 
	if (osvi.dwMajorVersion >= 5) 
	{ 
		clrHotText = ::GetSysColor (COLOR_HOTLIGHT); 
	} 
	else 
#endif 
	{ 
		clrHotText = RGB (0, 0, 255);	// Light blue 
	} 
 
	hbrBtnShadow = ::GetSysColorBrush (COLOR_BTNSHADOW); 
	ASSERT(hbrBtnShadow != NULL); 
 
	hbrBtnHilite = ::GetSysColorBrush (COLOR_BTNHIGHLIGHT); 
	ASSERT(hbrBtnHilite != NULL); 
 
	hbrWindow = ::GetSysColorBrush (COLOR_WINDOW); 
	ASSERT(hbrWindow != NULL); 
 
	brBtnFace.DeleteObject (); 
	brBtnFace.CreateSolidBrush (clrBtnFace); 
 
	brBarFace.DeleteObject (); 
	brBarFace.CreateSolidBrush (clrBarFace); 
 
	brActiveCaption.DeleteObject (); 
	brActiveCaption.CreateSolidBrush (clrActiveCaption); 
 
	brInactiveCaption.DeleteObject (); 
	brInactiveCaption.CreateSolidBrush (clrInactiveCaption); 
 
	brHilite.DeleteObject (); 
	brHilite.CreateSolidBrush (clrHilite); 
 
	brBlack.DeleteObject (); 
	brBlack.CreateSolidBrush (clrBtnDkShadow); 
 
	brWindow.DeleteObject (); 
	brWindow.CreateSolidBrush (clrWindow); 
 
	CWindowDC dc (NULL); 
	m_nBitsPerPixel = dc.GetDeviceCaps (BITSPIXEL); 
 
	if (brLight.GetSafeHandle ()) 
	{ 
		brLight.DeleteObject (); 
	} 
	 
	if (m_nBitsPerPixel > 8) 
	{ 
		COLORREF clrLight = RGB ( 
			GetRValue(clrBtnFace) + ((GetRValue(clrBtnHilite) - 
				GetRValue(clrBtnFace)) / 2 ), 
			GetGValue(clrBtnFace) + ((GetGValue(clrBtnHilite) - 
				GetGValue(clrBtnFace)) / 2), 
			GetBValue(clrBtnFace) + ((GetBValue(clrBtnHilite) - 
				GetBValue(clrBtnFace)) / 2) 
			); 
 
		brLight.CreateSolidBrush (clrLight); 
	} 
	else 
	{ 
		HBITMAP hbmGray = CreateDitherBitmap (dc.GetSafeHdc ()); 
		ASSERT (hbmGray != NULL); 
 
		CBitmap bmp; 
		bmp.Attach (hbmGray); 
 
		brLight.CreatePatternBrush (&bmp); 
	} 
 
	CMenuImages::CleanUp (); 
} 
//************************************************************************************ 
BOOL GLOBAL_DATA::SetMenuFont (LPLOGFONT lpLogFont, BOOL bHorz) 
{ 
	ASSERT (lpLogFont != NULL); 
 
	if (bHorz) 
	{ 
		//--------------------- 
		// Create regular font: 
		//--------------------- 
		fontRegular.DeleteObject (); 
		if (!fontRegular.CreateFontIndirect (lpLogFont)) 
		{ 
			ASSERT (FALSE); 
			return FALSE; 
		} 
 
		//----------------------- 
		// Create underline font: 
		//----------------------- 
		lpLogFont->lfUnderline = TRUE; 
		fontUnderline.DeleteObject (); 
		fontUnderline.CreateFontIndirect (lpLogFont); 
		lpLogFont->lfUnderline = FALSE; 
 
		//--------------------------------------------------- 
		// Create bold font (used in the default menu items): 
		//--------------------------------------------------- 
		long lSavedWeight = lpLogFont->lfWeight; 
		lpLogFont->lfWeight = 700; 
 
		fontBold.DeleteObject (); 
		BOOL bResult = fontBold.CreateFontIndirect (lpLogFont); 
 
		lpLogFont->lfWeight = lSavedWeight;	// Restore weight 
 
		if (!bResult) 
		{ 
			ASSERT (FALSE); 
			return FALSE; 
		} 
	} 
	else	// Vertical font 
	{ 
		fontVert.DeleteObject (); 
		if (!fontVert.CreateFontIndirect (lpLogFont)) 
		{ 
			ASSERT (FALSE); 
			return FALSE; 
		} 
	} 
 
	UpdateTextMetrics(); 
	return TRUE; 
} 
//************************************************************************************ 
void GLOBAL_DATA::UpdateTextMetrics () 
{ 
	CWindowDC dc (NULL); 
 
	CFont* pOldFont = dc.SelectObject (&fontRegular); 
	ASSERT (pOldFont != NULL); 
 
	TEXTMETRIC tm; 
	dc.GetTextMetrics (&tm); 
 
	m_nTextHeightHorz = tm.tmHeight + 2; 
 
	dc.SelectObject (&fontVert); 
	dc.GetTextMetrics (&tm); 
 
	m_nTextHeightVert = tm.tmHeight + 2; 
 
	dc.SelectObject (pOldFont); 
} 
//******************************************************************************* 
HBITMAP GLOBAL_DATA::CreateDitherBitmap (HDC hDC) 
{ 
	struct  // BITMAPINFO with 16 colors 
	{ 
		BITMAPINFOHEADER bmiHeader; 
		RGBQUAD      bmiColors[16]; 
	}  
	bmi; 
	memset(&bmi, 0, sizeof(bmi)); 
 
	bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
	bmi.bmiHeader.biWidth = 8; 
	bmi.bmiHeader.biHeight = 8; 
	bmi.bmiHeader.biPlanes = 1; 
	bmi.bmiHeader.biBitCount = 1; 
	bmi.bmiHeader.biCompression = BI_RGB; 
 
	COLORREF clr = globalData.clrBtnFace; 
 
	bmi.bmiColors[0].rgbBlue = GetBValue(clr); 
	bmi.bmiColors[0].rgbGreen = GetGValue(clr); 
	bmi.bmiColors[0].rgbRed = GetRValue(clr); 
 
	clr = ::GetSysColor(COLOR_BTNHIGHLIGHT); 
	bmi.bmiColors[1].rgbBlue = GetBValue(clr); 
	bmi.bmiColors[1].rgbGreen = GetGValue(clr); 
	bmi.bmiColors[1].rgbRed = GetRValue(clr); 
 
	// initialize the brushes 
	long patGray[8]; 
	for (int i = 0; i < 8; i++) 
	   patGray[i] = (i & 1) ? 0xAAAA5555L : 0x5555AAAAL; 
 
	HBITMAP hbm = CreateDIBitmap(hDC, &bmi.bmiHeader, CBM_INIT, 
		(LPBYTE)patGray, (LPBITMAPINFO)&bmi, DIB_RGB_COLORS); 
	return hbm; 
} 
//************************************************************************************* 
void GLOBAL_DATA::CleanUp () 
{ 
	if (brLight.GetSafeHandle ()) 
	{ 
		brLight.DeleteObject (); 
	} 
	 
	// cleanup fonts: 
	fontRegular.DeleteObject (); 
	fontBold.DeleteObject (); 
	fontUnderline.DeleteObject (); 
	fontVert.DeleteObject (); 
	fontVertCaption.DeleteObject (); 
	fontTooltip.DeleteObject (); 
 
	if (m_hinstUXThemeDLL != NULL) 
	{ 
		::FreeLibrary (m_hinstUXThemeDLL); 
		m_hinstUXThemeDLL = NULL; 
	} 
} 
//************************************************************************************* 
BCGCBPRODLLEXPORT void BCGCBProCleanUp () 
{ 
	globalData.CleanUp (); 
 
	g_menuHash.CleanUp (); 
 
	CBCGPToolBar::CleanUpImages (); 
	CMenuImages::CleanUp (); 
 
	if (GetCmdMgr () != NULL) 
	{ 
		GetCmdMgr ()->CleanUp (); 
	} 
 
	CBCGPKeyboardManager::CleanUp (); 
 
	// Destroy visualization manager: 
	CBCGPVisualManager* pVisManager = CBCGPVisualManager::GetInstance (); 
	if (pVisManager != NULL && pVisManager->IsAutoDestroy ()) 
	{ 
		delete pVisManager; 
	} 
} 
//**************************************************************************************** 
BOOL GLOBAL_DATA::DrawParentBackground (CWnd* pWnd, CDC* pDC, LPRECT rectClip) 
{ 
	ASSERT_VALID (pDC); 
	ASSERT_VALID (pWnd); 
 
	BOOL bRes = FALSE; 
 
	if (rectClip != NULL) 
	{ 
		CRgn rgn; 
		rgn.CreateRectRgnIndirect (rectClip); 
 
		pDC->SelectClipRgn (&rgn); 
	} 
 
	CWnd* pParent = pWnd->GetParent (); 
	ASSERT_VALID (pParent); 
 
	// In Windows XP, we need to call DrawThemeParentBackground function to implement 
	// transparent controls 
	if (m_hinstUXThemeDLL == NULL) 
	{ 
		m_hinstUXThemeDLL = LoadLibrary (_T("UxTheme.dll")); 
	} 
 
	if (m_hinstUXThemeDLL != NULL) 
	{ 
		typedef HRESULT (__stdcall * DRAWTHEMEPARENTBACKGROUND)(HWND hWnd, HDC hdc,const RECT *pRec); 
		DRAWTHEMEPARENTBACKGROUND m_pfDrawThemeBackground =  
			(DRAWTHEMEPARENTBACKGROUND)::GetProcAddress (m_hinstUXThemeDLL, "DrawThemeParentBackground"); 
 
		if (m_pfDrawThemeBackground != NULL) 
		{ 
			bRes = (*m_pfDrawThemeBackground) (pWnd->GetSafeHwnd (),  
				pDC->GetSafeHdc (), rectClip) == S_OK; 
		} 
	} 
 
	if (!bRes) 
	{ 
		CPoint pt (0, 0); 
		pWnd->MapWindowPoints (pParent, &pt, 1); 
		pt = pDC->OffsetWindowOrg (pt.x, pt.y); 
 
		bRes = (BOOL) pParent->SendMessage (WM_ERASEBKGND, (WPARAM)pDC->m_hDC); 
 
		pDC->SetWindowOrg(pt.x, pt.y); 
	} 
 
	pDC->SelectClipRgn (NULL); 
 
	return bRes; 
} 
 
BCGCBPRODLLEXPORT CFrameWnd* BCGPGetParentFrame (const CWnd* pWnd) 
{ 
	if (pWnd->GetSafeHwnd () == NULL) 
	{ 
		return NULL; 
	} 
	ASSERT_VALID (pWnd); 
 
	const CWnd* pParentWnd = pWnd; 
 
	while (pParentWnd != NULL) 
	{ 
		if (pParentWnd->IsKindOf (RUNTIME_CLASS (CBCGPMiniFrameWnd))) 
		{ 
			CBCGPMiniFrameWnd* pMiniFrame = DYNAMIC_DOWNCAST (CBCGPMiniFrameWnd, pParentWnd); 
			pParentWnd = pMiniFrame->GetParent (); 
		} 
		else 
		{ 
			pParentWnd = pParentWnd->GetParent (); 
		} 
 
		if (pParentWnd == NULL) 
		{ 
			return NULL; 
		} 
		if (pParentWnd->IsFrameWnd ()) 
		{ 
			return (CFrameWnd*)pParentWnd; 
		} 
	} 
 
	return NULL; 
} 
//*********************************************************************************** 
COLORREF GLOBAL_DATA::GetColor (int nColor) 
{ 
	switch (nColor) 
	{ 
	case COLOR_BTNFACE:             return clrBtnFace; 
	case COLOR_BTNSHADOW:           return clrBtnShadow;			 
	case COLOR_3DDKSHADOW:          return clrBtnDkShadow;			 
	case COLOR_3DLIGHT:             return clrBtnLight;				 
	case COLOR_BTNHIGHLIGHT:        return clrBtnHilite;			 
	case COLOR_BTNTEXT:             return clrBtnText;				 
	case COLOR_GRAYTEXT:            return clrGrayedText;			 
	case COLOR_WINDOWFRAME:         return clrWindowFrame;			 
	                           
	case COLOR_HIGHLIGHT:           return clrHilite;				 
	case COLOR_HIGHLIGHTTEXT:       return clrTextHilite;			 
	                           
	case COLOR_WINDOW:				return clrWindow;				 
	case COLOR_WINDOWTEXT:			return clrWindowText;			 
	                           
	case COLOR_CAPTIONTEXT:			return clrCaptionText;			 
	case COLOR_MENUTEXT:			return clrMenuText;				 
	                           
	case COLOR_ACTIVECAPTION:		return clrActiveCaption;		 
	case COLOR_INACTIVECAPTION:		return clrInactiveCaption;		 
	                           
	case COLOR_ACTIVEBORDER:		return clrActiveBorder;			 
	case COLOR_INACTIVEBORDER:		return clrInactiveBorder; 
	                           
	case COLOR_INACTIVECAPTIONTEXT:	return clrInactiveCaptionText; 
	} 
 
	return ::GetSysColor (nColor); 
}