////////////////////////////////////////////////////////////////// // File : exres.cpp // Owner : ToshiaK // Purpose : Wrapper function for Gettting resource with Specified // language ID. // In WinNT, GetThreadLocale() SetThreadLocale() works // and before getting resource, change LangId temporary, // call normal API for getting resource, // and reset LangID to previous one. // In Win95, SetThreadLocale() does NOT work. // in this case, Load resource directory and // find spcified language resource. // // Copyright(c) 1991-1997, Microsoft Corp. All rights reserved // ////////////////////////////////////////////////////////////////// #define WIN32_LEAN_AND_MEAN #include #include #include "exres.h" //---------------------------------------------------------------- // Internal memory Allocate Free function. //---------------------------------------------------------------- inline LPVOID ExMemAlloc(INT size) { return (LPVOID)GlobalAllocPtr(GHND, (size)); } inline BOOL ExMemFree(LPVOID lp) { #ifndef UNDER_CE return GlobalFreePtr((lp)); #else // UNDER_CE return (BOOL)GlobalFreePtr((lp)); #endif // UNDER_CE } inline Min(INT a, INT b) { return ((a)<(b)?(a):(b)) ; } //---------------------------------------------------------------- // Function for Getting OS version //---------------------------------------------------------------- inline static POSVERSIONINFO ExGetOSVersion(VOID) { static BOOL fFirst = TRUE; static OSVERSIONINFO os; if ( fFirst ) { os.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if (GetVersionEx( &os ) ) { fFirst = FALSE; } } return &os; } inline static BOOL ExIsWin95(VOID) { BOOL fBool; fBool = (ExGetOSVersion()->dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) && (ExGetOSVersion()->dwMajorVersion >= 4) && (ExGetOSVersion()->dwMinorVersion < 10); return fBool; } inline static BOOL ExIsWin98(VOID) { BOOL fBool; fBool = (ExGetOSVersion()->dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) && (ExGetOSVersion()->dwMajorVersion >= 4) && (ExGetOSVersion()->dwMinorVersion >= 10); return fBool; } inline static BOOL ExIsWinNT4(VOID) { BOOL fBool; fBool = (ExGetOSVersion()->dwPlatformId == VER_PLATFORM_WIN32_NT) && (ExGetOSVersion()->dwMajorVersion >= 4) && (ExGetOSVersion()->dwMinorVersion >= 0); return fBool; } inline static BOOL ExIsWinNT5(VOID) { BOOL fBool; fBool = (ExGetOSVersion()->dwPlatformId == VER_PLATFORM_WIN32_NT) && (ExGetOSVersion()->dwMajorVersion >= 5) && (ExGetOSVersion()->dwMinorVersion >= 0); return fBool; } inline static BOOL ExIsWinNT(VOID) { return (ExIsWinNT4() || ExIsWinNT5()); } //---------------------------------------------------------------- // Resource API open to public //---------------------------------------------------------------- ////////////////////////////////////////////////////////////////// // Function : ExLoadStringW // Type : INT // Purpose : Wrapper of LoadStrinW() API. // Load Unicode string with specified Language // in any platform. // Args : // : LANGID lgid // : HINSTANCE hInst // : UINT uID // : LPWSTR lpBuffer // : INT nBufferMax // Return : // DATE : 971028 ////////////////////////////////////////////////////////////////// INT WINAPI ExLoadStringW(LANGID lgid, HINSTANCE hInst, UINT uID, LPWSTR lpBuffer, INT nBufferMax) { if(!hInst) { return 0; } if(!lpBuffer) { return 0; } #if 0 if(ExIsWinNT()) { LCID lcidOrig = GetThreadLocale(); SetThreadLocale(MAKELCID(lgid, SORT_DEFAULT)); INT ret = LoadStringW(hInst, uID, lpBuffer, nBufferMax); SetThreadLocale(lcidOrig); return ret; } #endif INT len = 0; UINT block, num; block = (uID >>4)+1; num = uID & 0xf; HRSRC hres; hres = FindResourceEx(hInst, RT_STRING, MAKEINTRESOURCE(block), (WORD)lgid); //Dbg(("hres[0x%08x]\n", hres)); if(!hres) { goto Error; } HGLOBAL hgbl; hgbl = LoadResource(hInst, hres); if(!hres) { goto Error; } //Dbg(("hgbl[0x%08x]\n", hgbl)); LPWSTR lpwstr; lpwstr = (LPWSTR)LockResource(hgbl); if(!lpwstr) { goto Error; } UINT i; for(i = 0; i < num; i++) { lpwstr += *lpwstr + 1; } len = *lpwstr; CopyMemory(lpBuffer, lpwstr+1, Min(len, nBufferMax-1) * sizeof(WCHAR)); lpBuffer[Min(len, nBufferMax-1)]= (WCHAR)0x0000; Error: return len; } ////////////////////////////////////////////////////////////////// // Function : ExLoadStringA // Type : INT // Purpose : Wrapper of LoadStringA(). // Args : // : LANGID lgid // : HINSTANCE hInst // : INT uID // : LPSTR lpBuffer // : INT nBufferMax // Return : // DATE : ////////////////////////////////////////////////////////////////// INT WINAPI ExLoadStringA(LANGID lgid, HINSTANCE hInst, INT uID, LPSTR lpBuffer, INT nBufferMax) { if(!hInst) { return 0; } if(!lpBuffer) { return 0; } #if 0 if(ExIsWinNT()) { LCID lcidOrig = GetThreadLocale(); SetThreadLocale(MAKELCID(lgid, SORT_DEFAULT)); INT len = LoadStringA(hInst, uID, lpBuffer, nBufferMax); SetThreadLocale(lcidOrig); return len; } #endif LPWSTR lpwstr = (LPWSTR)ExMemAlloc(nBufferMax*sizeof(WCHAR)); if(!lpwstr) { return 0; } INT len = ExLoadStringW(lgid, hInst, uID, lpwstr, nBufferMax); len = WideCharToMultiByte(932, WC_COMPOSITECHECK, lpwstr, -1, lpBuffer, nBufferMax, NULL, NULL); if( len ) { len --; // remove NULL char } ExMemFree(lpwstr); return len; } ////////////////////////////////////////////////////////////////// // Function : ExDialogBoxParamA // Type : int // Purpose : // Args : // : LANGID lgid // : HINSTANCE hInstance // handle to application instance // : LPCTSTR lpTemplateName // identifies dialog box template // : HWND hWndParent // handle to owner window // : DLGPROC lpDialogFunc // pointer to dialog box procedure // : LPARAM dwInitParam // initialization value // Return : // DATE : ////////////////////////////////////////////////////////////////// int WINAPI ExDialogBoxParamA(LANGID lgid, HINSTANCE hInstance, LPCTSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam) { DLGTEMPLATE*pDlgTmpl; pDlgTmpl = ExLoadDialogTemplate(lgid, hInstance, lpTemplateName); if(ExIsWinNT5()) { return (INT)DialogBoxIndirectParamW(hInstance, pDlgTmpl, hWndParent, lpDialogFunc, dwInitParam); } else { return (INT)DialogBoxIndirectParamA(hInstance, pDlgTmpl, hWndParent, lpDialogFunc, dwInitParam); } } ////////////////////////////////////////////////////////////////// // Function : ExDialogBoxParamW // Type : int // Purpose : // Args : // : LANGID lgid // : HINSTANCE hInstance // handle to application instance // : LPCWSTR lpTemplateName // identifies dialog box template // : HWND hWndParent // handle to owner window // : DLGPROC lpDialogFunc // pointer to dialog box procedure // : LPARAM dwInitParam // initialization value // Return : // DATE : ////////////////////////////////////////////////////////////////// int WINAPI ExDialogBoxParamW(LANGID lgid, HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam) { DLGTEMPLATE*pDlgTmpl; #ifndef UNDER_CE pDlgTmpl = ExLoadDialogTemplate(lgid, hInstance, MAKEINTRESOURCEA(lpTemplateName)); #else // UNDER_CE pDlgTmpl = ExLoadDialogTemplate(lgid, hInstance, MAKEINTRESOURCE(lpTemplateName)); #endif // UNDER_CE return (INT)DialogBoxIndirectParamW(hInstance, pDlgTmpl, hWndParent, lpDialogFunc, dwInitParam); } ////////////////////////////////////////////////////////////////// // Function : ExCreateDialogParamA // Type : HWND // Purpose : // Args : // : LANGID lgid // : HINSTANCE hInstance // handle to application instance // : LPCTSTR lpTemplateName // identifies dialog box template // : HWND hWndParent // handle to owner window // : DLGPROC lpDialogFunc // pointer to dialog box procedure // : LPARAM dwInitParam // initialization value // Return : // DATE : ////////////////////////////////////////////////////////////////// HWND WINAPI ExCreateDialogParamA(LANGID lgid, HINSTANCE hInstance, LPCTSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam) { DLGTEMPLATE*pDlgTmpl; pDlgTmpl = ExLoadDialogTemplate(lgid, hInstance, lpTemplateName); if(ExIsWinNT5()) { return CreateDialogIndirectParamW( hInstance, pDlgTmpl, hWndParent, lpDialogFunc, dwInitParam); } else { return CreateDialogIndirectParamA( hInstance, pDlgTmpl, hWndParent, lpDialogFunc, dwInitParam); } } ////////////////////////////////////////////////////////////////// // Function : ExCreateDialogParamW // Type : HWND // Purpose : // Args : // : LANGID lgid // : HINSTANCE hInstance // handle to application instance // : LPCTSTR lpTemplateName // identifies dialog box template // : HWND hWndParent // handle to owner window // : DLGPROC lpDialogFunc // pointer to dialog box procedure // : LPARAM dwInitParam // initialization value // Return : // DATE : ////////////////////////////////////////////////////////////////// HWND WINAPI ExCreateDialogParamW(LANGID lgid, HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam) { DLGTEMPLATE*pDlgTmpl; #ifndef UNDER_CE pDlgTmpl = ExLoadDialogTemplate(lgid, hInstance, MAKEINTRESOURCEA(lpTemplateName)); #else // UNDER_CE pDlgTmpl = ExLoadDialogTemplate(lgid, hInstance, MAKEINTRESOURCE(lpTemplateName)); #endif // UNDER_CE return CreateDialogIndirectParamW( hInstance, pDlgTmpl, hWndParent, lpDialogFunc, dwInitParam); } ////////////////////////////////////////////////////////////////// // Function : ExLoadDialogTemplate // Type : DLGTEMPLATE * // Purpose : // Args : // : LANGID lgid // : HINSTANCE hInstance // : LPCSTR pchTemplate // Return : // DATE : ////////////////////////////////////////////////////////////////// DLGTEMPLATE * WINAPI ExLoadDialogTemplate(LANGID lgid, HINSTANCE hInstance, #ifndef UNDER_CE LPCSTR pchTemplate) #else // UNDER_CE LPCTSTR pchTemplate) #endif // UNDER_CE { HRSRC hResDlg; HANDLE hDlgTmpl; #ifndef UNDER_CE hResDlg = FindResourceExA( hInstance, RT_DIALOG, pchTemplate, lgid); #else // UNDER_CE hResDlg = FindResourceEx(hInstance, RT_DIALOG, pchTemplate, lgid); #endif // UNDER_CE if((hResDlg == NULL) && (lgid != MAKELANGID( LANG_NEUTRAL, SUBLANG_NEUTRAL))) { #ifndef UNDER_CE hResDlg = FindResourceExA(hInstance, RT_DIALOG, pchTemplate, MAKELANGID( LANG_NEUTRAL, SUBLANG_NEUTRAL)); #else // UNDER_CE hResDlg = FindResourceEx(hInstance, RT_DIALOG, pchTemplate, MAKELANGID( LANG_NEUTRAL, SUBLANG_NEUTRAL)); #endif // UNDER_CE } if (hResDlg == NULL) { return NULL; } hDlgTmpl = LoadResource( hInstance, hResDlg ); if(hDlgTmpl == NULL) { return NULL; /* failed */ } return (DLGTEMPLATE *)LockResource( hDlgTmpl ); } ////////////////////////////////////////////////////////////////// // Function : ExLoadMenuTemplate // Type : MENUTEMPLATE * // Purpose : // Args : // : LANGID lgid // : HINSTANCE hInstance // : LPCSTR pchTemplate // Return : // DATE : ////////////////////////////////////////////////////////////////// static MENUTEMPLATE* ExLoadMenuTemplate(LANGID lgid, HINSTANCE hInstance, #ifndef UNDER_CE LPCSTR pchTemplate) #else // UNDER_CE LPCTSTR pchTemplate) #endif // UNDER_CE { HRSRC hResMenu; HANDLE hMenuTmpl; hResMenu = FindResourceEx( hInstance, RT_MENU, pchTemplate, lgid); if((hResMenu == NULL) && (lgid != MAKELANGID( LANG_NEUTRAL, SUBLANG_NEUTRAL))) { hResMenu = FindResourceEx(hInstance, RT_MENU, pchTemplate, MAKELANGID( LANG_NEUTRAL, SUBLANG_NEUTRAL)); } if (hResMenu == NULL) { return NULL; } hMenuTmpl = LoadResource( hInstance, hResMenu ); if(hMenuTmpl == NULL) { return NULL; /* failed */ } return (MENUTEMPLATE *)LockResource( hMenuTmpl ); } ////////////////////////////////////////////////////////////////// // Function : ExLoadMenu // Type : HMENU // Purpose : // Args : // : LANGID lgid // : HINSTANCE hInstance // handle to application instance // : LPCTSTR lpMenuName // identifies menu template // Return : // DATE : ////////////////////////////////////////////////////////////////// HMENU WINAPI ExLoadMenu (LANGID lgid, HINSTANCE hInstance, LPCTSTR lpMenuName ) { #ifndef UNDER_CE // not support LoadMenuIndirect MENUTEMPLATE* pMenuTmpl; pMenuTmpl = ExLoadMenuTemplate(lgid, hInstance, lpMenuName); return LoadMenuIndirect( pMenuTmpl ); #else // UNDER_CE return ::LoadMenu(hInstance, lpMenuName); #endif // UNDER_CE } ////////////////////////////////////////////////////////////////// // Function : SetDefaultGUIFont // Type : static INT // Purpose : Searh All children window and Call SendMessage() // with WM_SETFONT. // It is called recursively. // Args : // : HWND hwndParent // Return : // DATE : ////////////////////////////////////////////////////////////////// static INT SetDefaultGUIFont(HWND hwndParent) { HWND hwndChild; if(!hwndParent) { return 0; } SendMessage(hwndParent, WM_SETFONT, (WPARAM)(HFONT)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE, 0)); for(hwndChild = GetWindow(hwndParent, GW_CHILD); hwndChild != NULL; hwndChild = GetWindow(hwndChild, GW_HWNDNEXT)) { SetDefaultGUIFont(hwndChild); } return 0; } ////////////////////////////////////////////////////////////////// // Function : SetDefaultGUIFontEx // Type : static INT // Purpose : Searh All children window and Call SendMessage() // with WM_SETFONT. // It is called recursively. // Args : // : HWND hwndParent // : HFONT hFont // Return : // DATE : ////////////////////////////////////////////////////////////////// static INT SetDefaultGUIFontEx(HWND hwndParent, HFONT hFont) { HWND hwndChild; if(!hwndParent) { return 0; } SendMessage(hwndParent, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0)); for(hwndChild = GetWindow(hwndParent, GW_CHILD); hwndChild != NULL; hwndChild = GetWindow(hwndChild, GW_HWNDNEXT)) { SetDefaultGUIFontEx(hwndChild, hFont); } return 0; } ////////////////////////////////////////////////////////////////// // Function : WINAPI ExSetDefaultGUIFont // Type : VOID // Purpose : Change GUI font as DEFAULT_GUI_FONT // In Win95, WinNT4, DEFAULT_GUI_FONT is "‚l‚r ‚o ƒSƒVƒbƒN" // In Memphis, WinNT5.0 DEFAULT_GUI_FONT is "MS UI Gothic" // IME98's Dialog resource uses "MS UI Gothic" as their font. // if IME98 works in Win95 or WinNT40, This API Call SendMessage() with WM_SETFONT // to all children window. // It should be called in WM_INITDIALOG. If you are creating new child window, // You have to call it after new window was created. // Args : // : HWND hwndDlg: Set the Dialog window handle to change font. // Return : none // DATE : ////////////////////////////////////////////////////////////////// VOID WINAPI ExSetDefaultGUIFont(HWND hwndDlg) { //It is Valid only if platform is WinNT4.0 or Win95 //if(ExIsWinNT5() || ExIsWin98()) { SetDefaultGUIFont(hwndDlg); UpdateWindow(hwndDlg); //} return; } ////////////////////////////////////////////////////////////////// // Function : WINAPI ExSetDefaultGUIFontEx // Type : VOID // Purpose : Change GUI font to given font. // It should be called in WM_INITDIALOG. If you are creating new child window, // you have to call it after new window was created. // If hFont is NULL, it will call ExSetDefaultGUIFont // Args : // : HWND hwndDlg: Set the Dialog window handle to change font. // : HFONT hFont : Font handle which will be applied to. // Return : none // DATE : ////////////////////////////////////////////////////////////////// VOID WINAPI ExSetDefaultGUIFontEx(HWND hwndDlg, HFONT hFont) { if(NULL == hFont){ ExSetDefaultGUIFont(hwndDlg); }else{ SetDefaultGUIFontEx(hwndDlg, hFont); UpdateWindow(hwndDlg); } return; }