windows-nt/Source/XPSP1/NT/enduser/stuff/hhctrl/rescache.cpp
2020-09-26 16:20:57 +08:00

496 lines
14 KiB
C++
Raw Blame History

//////////////////////////////////////////////////////////////////////////
//
//
// rescache.cpp --- Implementation file for CResourceCache
//
//
/*
*/
//////////////////////////////////////////////////////////////////////////
//
// Includes
//
#include "header.h"
// String Ids.
#include "strtable.h"
// Resource IDs
#include "resource.h"
//Our header
//#include "rescache.h"
//////////////////////////////////////////////////////////////////////////
//
// Globals
//
CResourceCache _Resource ;
//////////////////////////////////////////////////////////////////////////
//
// CResourceCache
//
//////////////////////////////////////////////////////////////////////////
//
// Constuctor
//
CResourceCache::CResourceCache()
: m_pszMsgBoxTitle(NULL),
m_hUIFontDefault(NULL),
m_hAccel(NULL),
m_bInitTabCtrlKeys(false),
m_hInstRichEdit(0),
m_hUIAccessableFontDefault(NULL)
{
}
//////////////////////////////////////////////////////////////////////////
//
// Destruct
//
CResourceCache::~CResourceCache()
{
CHECK_AND_FREE( m_pszMsgBoxTitle );
if ( m_hUIAccessableFontDefault && (m_hUIAccessableFontDefault != m_hUIFontDefault) )
{
DeleteObject(m_hUIAccessableFontDefault);
}
if (m_hUIFontDefault)
{
DeleteObject(m_hUIFontDefault);
}
// Get rid of our accelerator table.
if (m_hAccel)
{
DestroyAcceleratorTable(m_hAccel);
}
if (m_hInstRichEdit)
{
FreeLibrary(m_hInstRichEdit);
}
}
//////////////////////////////////////////////////////////////////////////
//
// Initialization Functions
//
//////////////////////////////////////////////////////////////////////////
//
// InitMsgBoxTitle
//
void
CResourceCache::InitMsgBoxTitle()
{
ASSERT(m_pszMsgBoxTitle == NULL) ;
m_pszMsgBoxTitle = lcStrDup(GetStringResource(IDS_MSGBOX_TITLE));
}
/////////////////////////////////////////////////////////////////////////
//
// Init the RichEdit control if we need it.
//
void
CResourceCache::InitRichEdit()
{
if ( (m_hInstRichEdit == 0) && (GetVersion() > 0x80000000) )
m_hInstRichEdit = LoadLibrary("riched20.dll");
}
//////////////////////////////////////////////////////////////////////////
//
// InitAcceleratorTable
//
void
CResourceCache::InitAcceleratorTable()
{
// Create the accelerator table.
ASSERT(m_hAccel == NULL) ;
m_hAccel = LoadAccelerators(_Module.GetResourceInstance(), MAKEINTRESOURCE(HH_ACCELERATORS));
ASSERT(m_hAccel) ;
}
#if 0
//////////////////////////////////////////////////////////////////////////
//
// InitDefaultFont
//
void
CResourceCache::InitDefaultFont(HDC hDC, HFONT* phFont)
{
HFONT hFont;
if (! phFont )
{
ASSERT(m_hfontDefault == NULL) ;
if ( m_hfontDefault )
return;
}
// Create a default font from our resource file
int dyHeight = 0;
PSTR pszFontName = (PSTR) GetStringResource(IDS_DEFAULT_RES_FONT);
HWND hwndDesktop = GetDesktopWindow();
HDC hdc = GetDC(hwndDesktop);
int YAspectMul;
if (!hdc)
{
ASSERT(0) ; //TODO: Fix
return ;
}
// Get current text metrics
TEXTMETRIC tm;
GetTextMetrics(hdc, &tm);
WORD defcharset = (WORD) tm.tmCharSet;
YAspectMul = GetDeviceCaps(hDC?hDC:hdc, LOGPIXELSY);
ReleaseDC(hwndDesktop, hdc);
PSTR pszPoint = StrChr(pszFontName, ',');
if (pszPoint)
{
*pszPoint = '\0';
pszPoint = FirstNonSpace(pszPoint + 1);
if (IsDigit((BYTE) *pszPoint))
{
dyHeight = MulDiv(YAspectMul, Atoi(pszPoint) * 2, 144);
}
}
if (!dyHeight)
dyHeight = YAspectMul / 6;
if(g_langSystem == LANG_RUSSIAN)
defcharset = RUSSIAN_CHARSET;
// For non-localized OCX on DBCS platforms, we need to increase font size by one point
//
if (g_fDBCSSystem && CompareString(LOCALE_SYSTEM_DEFAULT,NORM_IGNORECASE, pszFontName,-1,"Arial",-1) == 2)
dyHeight++; // increase size by one point
if (g_langSystem == LANG_THAI &&
CompareString(LOCALE_SYSTEM_DEFAULT,NORM_IGNORECASE, pszFontName,-1,"Arial",-1) == 2)
{
LONG dyHeightThai = MulDiv(YAspectMul, dyHeight * 2, 144);
hFont = CreateFont(-(dyHeightThai+1), 0, 0, 0, 0, 0, 0, 0,
THAI_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_DONTCARE, "Angsana New"); //"AngsanaUPC");
}
else
if (g_langSystem == LANG_JAPANESE &&
CompareString(LOCALE_SYSTEM_DEFAULT,NORM_IGNORECASE, pszFontName,-1,"Arial",-1) == 2)
{
hFont = CreateFont(-dyHeight, 0, 0, 0, 0, 0, 0, 0,
SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
VARIABLE_PITCH | FF_MODERN, "MS P-Gothic");
}
else
if (g_langSystem == LANG_CHINESE &&
CompareString(LOCALE_SYSTEM_DEFAULT,NORM_IGNORECASE, pszFontName,-1,"Arial",-1) == 2)
{
hFont = CreateFont(-dyHeight, 0, 0, 0, 0, 0, 0, 0,
defcharset, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
VARIABLE_PITCH | FF_MODERN, "<22><><EFBFBD><EFBFBD>");
}
else
{
hFont = CreateFont(-dyHeight, 0, 0, 0, 0, 0, 0, 0,
defcharset, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
VARIABLE_PITCH | FF_MODERN, pszFontName);
}
ASSERT(hFont);
if ( phFont )
*phFont = hFont;
else
m_hfontDefault = hFont;
#ifdef _DEBUG
LOGFONT lf ;
int r = GetObject(m_hfontDefault, sizeof(lf), &lf) ;
#endif
}
#endif
//////////////////////////////////////////////////////////////////////////
//
// InitDefaultUIFont
//
// Init the font that will be used to render all strings that come from hhctrl.ocx resources.
//
void
CResourceCache::InitDefaultUIFont(HDC hDC, HFONT* phFont)
{
HFONT hFont;
HDC hdc;
int dyHeight = 0;
int YAspectMul;
WORD CharsetSpec = 0;
WORD DefCharset;
int iFontSpecResID = IDS_DEFAULT_RES_FONT;
PSTR pszFontName;
WCHAR *pwsFontName;
if (! phFont )
{
ASSERT(m_hUIFontDefault == NULL) ;
if ( m_hUIFontDefault )
return;
}
// Create a default font from our resource file. We use a different resource font spec depending
// on OS...
//
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
#ifdef _DEBUG
char* sz1, *sz2, *sz3;
char szBuf[256];
char szBuf2[256];
if ( (GetKeyState(VK_SHIFT) < 0) )
{
sz1 = (PSTR)GetStringResource(IDS_DEFAULT_RES_FONT_NT5_WIN98);
sz2 = (PSTR)GetStringResource(IDS_DEFAULT_RES_FONT);
if ( _Module.m_Language.LoadSatellite() )
{
LANGID lid = _Module.m_Language.GetUiLanguage();
wsprintf(szBuf2, "Operating from Satalite DLL resources: mui\\%04x", lid);
sz3 = szBuf2;
}
else
sz3 = "Operating from hhctrl.ocx reources";
wsprintf(szBuf, "NT5/Win98 UIFont = %s\nNT4/Win95 UIFont = %s\n%s\n", sz1, sz2, sz3);
MsgBox(szBuf, MB_OK);
}
#endif
if ( (osvi.dwMajorVersion) == 5 || ((osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) && (osvi.dwMinorVersion == 10)) )
iFontSpecResID = IDS_DEFAULT_RES_FONT_NT5_WIN98;
if (g_bWinNT5)
{
if (! (pwsFontName = (WCHAR *) GetStringResourceW(iFontSpecResID)) || *pwsFontName == '\0' )
{
if (! (pwsFontName = (WCHAR *)GetStringResourceW(IDS_DEFAULT_RES_FONT)) || *pwsFontName == '\0' )
pwsFontName = L"MS Shell Dlg,8,0";
}
if (! (hdc = GetDC(NULL)) )
{
ASSERT(0) ;
return ;
}
// Get current text metrics
//
TEXTMETRIC tm;
GetTextMetrics(hdc, &tm);
DefCharset = (WORD) tm.tmCharSet;
YAspectMul = GetDeviceCaps(hDC?hDC:hdc, LOGPIXELSY);
ReleaseDC(NULL, hdc);
WCHAR *pwsComma = StrChrW(pwsFontName, ','); // Get point size specification.
if (pwsComma)
{
*pwsComma = '\0';
pwsComma = FirstNonSpaceW(pwsComma + 1);
if (IsDigit((BYTE) *pwsComma))
{
int hx = _wtoi(pwsComma);
dyHeight = MulDiv(YAspectMul, hx * 2, 144);
}
}
if ( (pwsComma = StrChrW(pwsComma, ',')) ) // Get charset specification.
{
pwsComma = FirstNonSpaceW(pwsComma + 1);
if (iswdigit((BYTE) *pwsComma))
{
// This indicates we are using a satalite DLL which means we want to trust the charset spec.
//
if ( _Module.m_Language.LoadSatellite() )
DefCharset = (CHAR)_wtoi(pwsComma);
}
}
}
else
{
if (! (pszFontName = (PSTR) GetStringResource(iFontSpecResID)) || *pszFontName == '\0' )
{
if (! (pszFontName = (PSTR)GetStringResource(IDS_DEFAULT_RES_FONT)) || *pszFontName == '\0' )
pszFontName = "MS Shell Dlg,8,0";
}
if (! (hdc = GetDC(NULL)) )
{
ASSERT(0) ;
return ;
}
// Get current text metrics
//
TEXTMETRIC tm;
GetTextMetrics(hdc, &tm);
DefCharset = (WORD) tm.tmCharSet;
YAspectMul = GetDeviceCaps(hDC?hDC:hdc, LOGPIXELSY);
ReleaseDC(NULL, hdc);
PSTR pszComma = StrChr(pszFontName, ','); // Get point size specification.
if (pszComma)
{
*pszComma = '\0';
pszComma = FirstNonSpace(pszComma + 1);
if (IsDigit((BYTE) *pszComma))
{
int hx = Atoi(pszComma);
dyHeight = MulDiv(YAspectMul, hx * 2, 144);
}
}
if ( (pszComma = StrChr(pszComma, ',')) ) // Get charset specification.
{
pszComma = FirstNonSpace(pszComma + 1);
if (IsDigit((BYTE) *pszComma))
{
// This indicates we are using a satalite DLL which means we want to trust the charset spec.
//
if ( _Module.m_Language.LoadSatellite() )
DefCharset = (CHAR)Atoi(pszComma);
}
}
}
if (!dyHeight)
dyHeight = YAspectMul / 6;
// Why is this here? We should have the correct defcharset from GetTextMetrics above correct?
//
if( g_langSystem == LANG_RUSSIAN )
DefCharset = RUSSIAN_CHARSET;
NONCLIENTMETRICS ncm;
// If we need to detect non-localized OCX on DBCS platforms, we need can use DefCharset vs CharsetSpec
// to see if they differ. <mikecole>
//
if (g_bWinNT5)
{
hFont = CreateFontW(-dyHeight, 0, 0, 0, 0, 0, 0, 0, DefCharset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, VARIABLE_PITCH | FF_MODERN, pwsFontName);
ncm.cbSize = sizeof(NONCLIENTMETRICS);
BOOL bRet = SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), (void*)&ncm, 0);
if ( bRet && (ncm.lfMenuFont.lfHeight < (-dyHeight)) )
{
m_hUIAccessableFontDefault = CreateFontW(ncm.lfMenuFont.lfHeight, 0, 0, 0, 0, 0, 0, 0, DefCharset,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
VARIABLE_PITCH | FF_MODERN, pwsFontName);
}
else
m_hUIAccessableFontDefault = hFont;
}
else
{
hFont = CreateFont(-dyHeight, 0, 0, 0, 0, 0, 0, 0, DefCharset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, VARIABLE_PITCH | FF_MODERN, pszFontName);
ncm.cbSize = sizeof(NONCLIENTMETRICS);
BOOL bRet = SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), (void*)&ncm, 0);
if ( bRet && (ncm.lfMenuFont.lfHeight < (-dyHeight)) )
{
m_hUIAccessableFontDefault = CreateFont(ncm.lfMenuFont.lfHeight, 0, 0, 0, 0, 0, 0, 0, DefCharset,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
VARIABLE_PITCH | FF_MODERN, pszFontName);
}
else
m_hUIAccessableFontDefault = hFont;
}
ASSERT(hFont);
if ( phFont )
*phFont = hFont;
else
m_hUIFontDefault = hFont;
#ifdef _DEBUG
LOGFONT lf ;
int r = GetObject(m_hUIFontDefault, sizeof(lf), &lf) ;
#endif
}
//////////////////////////////////////////////////////////////////////////
//
// InitTabCtrlKeys
//
void
CResourceCache::InitTabCtrlKeys()
{
#ifndef CHIINDEX
ASSERT(!m_bInitTabCtrlKeys) ;
// Zero out array
memset(m_TabCtrlKeys, NULL, c_NumTabCtrlKeys);
// Get the accelerators for the standard tabs
PCSTR psz = StrChr(GetStringResource(IDS_TAB_CONTENTS), '&');
if (psz)
m_TabCtrlKeys[HHWIN_NAVTYPE_TOC] = ToLower(psz[1]);
psz = StrChr(GetStringResource(IDS_TAB_INDEX), '&');
if (psz)
m_TabCtrlKeys[HHWIN_NAVTYPE_INDEX] = ToLower(psz[1]);
psz = StrChr(GetStringResource(IDS_TAB_SEARCH), '&');
if (psz)
m_TabCtrlKeys[HHWIN_NAVTYPE_SEARCH] = ToLower(psz[1]);
psz = StrChr(GetStringResource(IDS_TAB_HISTORY), '&');
if (psz)
m_TabCtrlKeys[HHWIN_NAVTYPE_HISTORY] = ToLower(psz[1]);
psz = StrChr(GetStringResource(IDS_TAB_FAVORITES), '&');
if (psz)
m_TabCtrlKeys[HHWIN_NAVTYPE_FAVORITES] = ToLower(psz[1]);
// Get the accelerators for menus and other none tab things.
psz = StrChr(GetStringResource(IDTB_OPTIONS), '&');
if (psz)
m_TabCtrlKeys[ACCEL_KEY_OPTIONS] = ToLower(psz[1]);
// Custom tab keys are initialized when the tabs are loaded.
// Finished initialization
m_bInitTabCtrlKeys = true ;
#endif
}
//////////////////////////////////////////////////////////////////////////
//
// Other Functions
//
//////////////////////////////////////////////////////////////////////////
//
// TabCtrlKeys -- Sets the tab accel keys for custom tabs
//
void
CResourceCache::TabCtrlKeys(int TabIndex, char ch) //Sets an accelerator key. Only used for custom tabs.
{
// Initialize, if needed.
if (!m_bInitTabCtrlKeys)
{
InitTabCtrlKeys() ;
}
if (TabIndex >= HH_TAB_CUSTOM_FIRST && TabIndex <= HH_TAB_CUSTOM_LAST)
{
m_TabCtrlKeys[TabIndex] = ch ;
}
}