You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

492 lines
13 KiB
C++

// XTPGlobal.cpp : implementation of the CXTPAuxData struct.
//
// This file is a part of the XTREME CONTROLS MFC class library.
// (c)1998-2012 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Common/Resource.h"
#include "Common/XTPDrawHelpers.h"
#include "Common/XTPVC80Helpers.h" // Visual Studio 2005 helper functions
#include "Common/XTPResourceManager.h"
#include "Common/XTPColorManager.h"
#include "Common/XTPSystemHelpers.h"
#include "../Resource.h"
#include "XTPGlobal.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#define new DEBUG_NEW
#endif
//=============================================================================
// CXTPNonClientMetrics
//=============================================================================
CXTPNonClientMetrics::CXTPNonClientMetrics()
{
::ZeroMemory(this, sizeof(NONCLIENTMETRICS));
cbSize = sizeof(NONCLIENTMETRICS);
VERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
sizeof(NONCLIENTMETRICS), this, 0));
}
//=============================================================================
// CXTPFontManager
//=============================================================================
CXTPLogFont::CXTPLogFont()
: dwType(0)
{
::ZeroMemory(this, sizeof(CXTPLogFont));
}
CXTPLogFont::CXTPLogFont(LOGFONT& logfont)
: dwType(0)
{
MEMCPY_S((void*)&*this, (const void*)&logfont, (DWORD)sizeof(LOGFONT));
}
void CXTPLogFont::operator=(LOGFONT& logfont)
{
MEMCPY_S((void*)&*this, (const void*)&logfont, (DWORD)sizeof(LOGFONT));
}
//=============================================================================
// CXTPAuxData
//=============================================================================
CXTPAuxData::CXTPAuxData()
{
iComCtlVersion = -1;
hcurDragCopy = NULL;
hcurDragMove = NULL;
hcurDragNone = NULL;
hcurHand = NULL;
hcurHSplitBar = NULL;
hcurVSplitBar = NULL;
hcurMove = NULL;
bUseOfficeFont = FALSE;
bUseSolidShadows = FALSE;
bMenuShadows = TRUE;
bWin95 = XTPSystemVersion()->IsWin95();
bWin98 = XTPSystemVersion()->IsWin98();
bWinNT = XTPSystemVersion()->IsWinNT4();
bWin2K = XTPSystemVersion()->IsWin2K();
bWinXP = XTPSystemVersion()->IsWinXP();
// Internet Explorer 4.0 or higher.
GetComCtlVersion();
VERIFY(IsComCtlValid());
UpdateSysColors();
UpdateSysMetrics();
// Load cursors and fonts.
LoadSysCursors();
LoadSysFonts();
}
CXTPAuxData::~CXTPAuxData()
{
FreeSysFonts();
}
// If LoadCursors() returns FALSE and your application is linking to the
// static version of the library you most likely need to include the following
// line in your .rc2 file: #include "XTResourcePro.rc". This name will vary
// depending on the library you are linking to.
BOOL CXTPAuxData::LoadSysCursors()
{
hcurDragNone = XTPResourceManager()->LoadCursor(XTP_IDC_DRAGNONE);
if (hcurDragNone == NULL)
return FALSE;
hcurDragCopy = XTPResourceManager()->LoadCursor(XTP_IDC_DRAGCOPY);
if (hcurDragCopy == NULL)
return FALSE;
hcurDragMove = XTPResourceManager()->LoadCursor(XTP_IDC_DRAGMOVE);
if (hcurDragMove == NULL)
return FALSE;
hcurHand = AfxGetApp()->LoadStandardCursor(MAKEINTRESOURCE(32649));
if (hcurHand == NULL)
hcurHand = XTPResourceManager()->LoadCursor(XTP_IDC_HAND);
if (hcurHand == NULL)
return FALSE;
hcurHSplitBar = XTPResourceManager()->LoadCursor(XTP_IDC_HSPLITBAR);
if (hcurHSplitBar == NULL)
return FALSE;
hcurVSplitBar = XTPResourceManager()->LoadCursor(XTP_IDC_VSPLITBAR);
if (hcurVSplitBar == NULL)
return FALSE;
hcurMove = AfxGetApp()->LoadStandardCursor(IDC_SIZEALL);
if (hcurMove == NULL)
return FALSE;
return TRUE;
}
void CXTPAuxData::UpdateSysColors()
{
RefreshXtremeColors();
// Initialize standard color for windows components.
clr3DFace = GetXtremeColor(COLOR_3DFACE);
clr3DShadow = GetXtremeColor(COLOR_3DSHADOW);
clr3DDkShadow = GetXtremeColor(COLOR_3DDKSHADOW);
clr3DHilight = GetXtremeColor(COLOR_3DHILIGHT);
clr3DLight = GetXtremeColor(COLOR_3DLIGHT);
clrBtnText = GetXtremeColor(COLOR_BTNTEXT);
clrGrayText = GetXtremeColor(COLOR_GRAYTEXT);
clrHighlight = GetXtremeColor(COLOR_HIGHLIGHT);
clrHighlightText = GetXtremeColor(COLOR_HIGHLIGHTTEXT);
clrMenu = GetXtremeColor(COLOR_MENU);
clrMenuText = GetXtremeColor(COLOR_MENUTEXT);
clrWindow = GetXtremeColor(COLOR_WINDOW);
clrWindowFrame = GetXtremeColor(COLOR_WINDOWFRAME);
clrWindowText = GetXtremeColor(COLOR_WINDOWTEXT);
clrActiveCaption = GetXtremeColor(COLOR_ACTIVECAPTION);
clrInActiveCaption = GetXtremeColor(COLOR_INACTIVECAPTION);
clrGradActiveCapt = GetXtremeColor(COLOR_GRADIENTACTIVECAPTION);
clrGradInActiveCapt = GetXtremeColor(COLOR_GRADIENTINACTIVECAPTION);
clrActiveCaptText = GetXtremeColor(COLOR_CAPTIONTEXT);
clrInactiveCaptText = GetXtremeColor(COLOR_INACTIVECAPTIONTEXT);
// Initialize special colors for XP style interfaces.
clrXPBarFace = GetXtremeColor(XPCOLOR_TOOLBAR_FACE);
clrXPHighlight = GetXtremeColor(XPCOLOR_HIGHLIGHT);
clrXPHighlightBorder = GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER);
clrXPHighlightPushed = GetXtremeColor(XPCOLOR_HIGHLIGHT_PUSHED);
clrXPIconShadow = GetXtremeColor(XPCOLOR_ICONSHADDOW);
clrXPGrayText = GetXtremeColor(XPCOLOR_GRAYTEXT);
clrXPHighlightChecked = GetXtremeColor(XPCOLOR_HIGHLIGHT_CHECKED);
clrXPHighlightCheckedBorder = GetXtremeColor(XPCOLOR_HIGHLIGHT_CHECKED_BORDER);
clrXPGripper = GetXtremeColor(XPCOLOR_TOOLBAR_GRIPPER);
clrXPSeparator = GetXtremeColor(XPCOLOR_SEPARATOR);
clrXPDisabled = GetXtremeColor(XPCOLOR_DISABLED);
clrXPMenuTextBack = GetXtremeColor(XPCOLOR_MENUBAR_FACE);
clrXPMenuExpanded = GetXtremeColor(XPCOLOR_MENUBAR_EXPANDED);
clrXPMenuBorder = GetXtremeColor(XPCOLOR_MENUBAR_BORDER);
clrXPMenuText = GetXtremeColor(XPCOLOR_MENUBAR_TEXT);
clrXPHighlightText = GetXtremeColor(XPCOLOR_HIGHLIGHT_TEXT);
clrXPBarText = GetXtremeColor(XPCOLOR_TOOLBAR_TEXT);
clrXPBarTextPushed = GetXtremeColor(XPCOLOR_PUSHED_TEXT);
clrXPTabInactiveBack = GetXtremeColor(XPCOLOR_TAB_INACTIVE_BACK);
clrXPTabInactiveText = GetXtremeColor(XPCOLOR_TAB_INACTIVE_TEXT);
}
void CXTPAuxData::UpdateSysMetrics()
{
cxSmIcon = ::GetSystemMetrics(SM_CXSMICON);
cySmIcon = ::GetSystemMetrics(SM_CYSMICON);
cxHThumb = ::GetSystemMetrics(SM_CXHTHUMB);
cyVThumb = ::GetSystemMetrics(SM_CYVTHUMB);
cyMenuItem = ::GetSystemMetrics(SM_CYMENU);
cxSize = 18; //::GetSystemMetrics(SM_CXSIZE);
cySize = 18; //::GetSystemMetrics(SM_CYSIZE);
}
BOOL CXTPAuxData::LoadSysFonts(LPCTSTR strHorzFaceName/*= _T("")*/, LPCTSTR strVertFaceName/*= _T("")*/)
{
CString strFaceTahoma(_T("Tahoma"));
CString strFaceArial(_T("Arial"));
// Free up any resources previously allocated.
FreeSysFonts();
CXTPNonClientMetrics ncm;
LOGFONT lfMenuFont;
MEMCPY_S(&lfMenuFont, &ncm.lfMenuFont, sizeof(LOGFONT));
lfMenuFont.lfCharSet = XTPResourceManager()->GetFontCharset();
if (strHorzFaceName != NULL)
{
if (FontExists(strHorzFaceName))
{
STRCPY_S(lfMenuFont.lfFaceName, LF_FACESIZE, strHorzFaceName);
STRCPY_S(ncm.lfStatusFont.lfFaceName, LF_FACESIZE, strHorzFaceName);
STRCPY_S(ncm.lfSmCaptionFont.lfFaceName, LF_FACESIZE, strHorzFaceName);
}
}
// check to see if we can use the "Tahoma" font.
else if (bUseOfficeFont && !(ncm.lfMenuFont.lfCharSet > SYMBOL_CHARSET))
{
if (FontExists(strFaceTahoma))
{
STRCPY_S(lfMenuFont.lfFaceName, LF_FACESIZE, strFaceTahoma);
}
}
// create the menu fonts.
if (!CreateSysFont(lfMenuFont, font))
return FALSE;
if (!CreateSysFont(lfMenuFont, fontBold, FW_BOLD))
return FALSE;
if (!CreateSysFont(lfMenuFont, fontULine, -1, 1))
return FALSE;
// If the "Tahoma" font is not used see if we can use "Arial" for vertical
// fonts because it displays better than MS Sans Serif on older operating
// systems...
if (strVertFaceName != NULL)
{
if (FontExists(strVertFaceName))
{
STRCPY_S(lfMenuFont.lfFaceName, LF_FACESIZE, strVertFaceName);
}
}
else if (strFaceTahoma.CompareNoCase(ncm.lfMenuFont.lfFaceName) != 0)
{
if (FontExists(strFaceArial))
{
STRCPY_S(lfMenuFont.lfFaceName, LF_FACESIZE, strFaceArial);
}
}
// create the vertical menu fonts.
if (!CreateSysFont(lfMenuFont, fontVert, -1, -1, 900, 2700))
return FALSE;
if (!CreateSysFont(lfMenuFont, fontVertBold, FW_BOLD, -1, 900, 2700))
return FALSE;
// create the icon title fonts.
CXTPLogFont lfIconTitleFont;
VERIFY(CXTPDrawHelpers::GetIconLogFont(&lfIconTitleFont));
if (!CreateSysFont(lfIconTitleFont, fontIconTitle))
return FALSE;
if (!CreateSysFont(lfIconTitleFont, fontIconTitleBold, FW_BOLD))
return FALSE;
// Create the status bar font.
if (!CreateSysFont(ncm.lfStatusFont, fontStatus))
return FALSE;
// Create the small caption font.
if (!CreateSysFont(ncm.lfSmCaptionFont, fontSmCaption))
return FALSE;
// Create the marlett icon font.
LOGFONT lfMarlettIcon = {lfIconTitleFont.lfHeight, 0, 0, 0, 0, 0, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, _T("Marlett")};
if (!CreateSysFont(lfMarlettIcon, fontMarlettIcon))
return FALSE;
return TRUE;
}
void CXTPAuxData::FreeSysFonts()
{
if (font.GetSafeHandle())
font.DeleteObject();
if (fontBold.GetSafeHandle())
fontBold.DeleteObject();
if (fontULine.GetSafeHandle())
fontULine.DeleteObject();
if (fontVert.GetSafeHandle())
fontVert.DeleteObject();
if (fontVertBold.GetSafeHandle())
fontVertBold.DeleteObject();
if (fontIconTitle.GetSafeHandle())
fontIconTitle.DeleteObject();
if (fontIconTitleBold.GetSafeHandle())
fontIconTitleBold.DeleteObject();
if (fontMarlettIcon.GetSafeHandle())
fontMarlettIcon.DeleteObject();
if (fontStatus.GetSafeHandle())
fontStatus.DeleteObject();
if (fontSmCaption.GetSafeHandle())
fontSmCaption.DeleteObject();
}
void CXTPAuxData::UseOfficeFont(BOOL bOfficeFont)
{
bUseOfficeFont = bOfficeFont;
LoadSysFonts();
}
BOOL CXTPAuxData::FontExists(LPCTSTR strFaceName)
{
return CXTPDrawHelpers::FontExists(strFaceName);
}
BOOL CXTPAuxData::CreateSysFont(const CXTPLogFont& logFont, CFont& font, long lfWeight/*= -1*/, char lfUnderline/*= -1*/, long lfOrientation/*= -1*/, long lfEscapement/*= -1*/)
{
// delete the font if it has already been created.
if (font.GetSafeHandle())
{
font.DeleteObject();
}
// construct the log font.
CXTPLogFont lf(logFont);
// set font weight.
if (lfWeight != -1)
{
lf.lfWeight = lfWeight;
}
// set font orientation.
if (lfOrientation != -1)
{
lf.lfOrientation = lfOrientation;
}
// set font escapement.
if (lfEscapement != -1)
{
lf.lfEscapement = lfEscapement;
}
// set font underline style.
if (lfUnderline != -1)
{
lf.lfUnderline = lfUnderline;
}
// create the font using the log font we constructed.
return font.CreateFontIndirect(&lf);
}
BOOL CXTPAuxData::SetGlobalFont(LPCTSTR lpszFaceName, LPCTSTR lpszVertFaceName/*= NULL*/)
{
return LoadSysFonts(lpszFaceName, lpszVertFaceName);
}
BOOL CXTPAuxData::SetGlobalFont(CFont* pHorzFont, CFont* pVertFont/*= NULL*/)
{
if (pHorzFont != NULL && pHorzFont->GetSafeHandle() != NULL)
{
CXTPLogFont lf;
pHorzFont->GetLogFont(&lf);
// create the menu fonts.
if (!CreateSysFont(lf, font))
return FALSE;
if (!CreateSysFont(lf, fontBold, FW_BOLD))
return FALSE;
if (!CreateSysFont(lf, fontULine, -1, 1))
return FALSE;
if (!CreateSysFont(lf, fontStatus))
return FALSE;
}
if (pVertFont != NULL && pVertFont->GetSafeHandle() != NULL)
{
CXTPLogFont lf;
pVertFont->GetLogFont(&lf);
if (!CreateSysFont(lf, fontVert, -1, -1, 900, 2700))
return FALSE;
if (!CreateSysFont(lf, fontVertBold, FW_BOLD, -1, 900, 2700))
return FALSE;
}
return TRUE;
}
DWORD CXTPAuxData::GetComCtlVersion()
{
iComCtlVersion = XTPSystemVersion()->GetComCtlVersion();
return iComCtlVersion;
}
BOOL CXTPAuxData::IsComCtlValid() const
{
return TRUE;
}
CString CXTPAuxData::XTPGetVersion(bool bVerNumOnly/*= false*/)
{
CString strVersion;
if (bVerNumOnly)
{
strVersion.Format(_T("%d.%02d"),
_XTPLIB_VERSION_MAJOR, _XTPLIB_VERSION_MINOR);
}
else
{
strVersion.Format(_T("Xtreme Toolkit v%d.%02d"),
_XTPLIB_VERSION_MAJOR, _XTPLIB_VERSION_MINOR);
}
return strVersion;
}
void CXTPAuxData::InitResources(HINSTANCE hInst)
{
// Set the resource handle used by the library.
XTPResourceManager()->SetResourceHandle(hInst);
LoadSysCursors(); // Load cursors.
}
_XTP_EXT_CLASS CXTPAuxData& AFXAPI XTPAuxData()
{
static CXTPAuxData instance;
return instance;
}
// CXTPTcbItem
CXTPTcbItem::CXTPTcbItem()
: uiToolTipId(0)
, pWnd(0)
, dwStyle(0)
, dwExStyle(0)
, crTabBack(COLORREF_NULL)
, crTabText(COLORREF_NULL)
, crTabSelBack(COLORREF_NULL)
, crTabSelText(COLORREF_NULL)
{
}