////////////////////////////////////////////////////////////////////////// // // // 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, "ËÎÌå"); } 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. // 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 ; } }