/******************************Module*Header*******************************\ * Module Name: ftwin95.c * * (Brief description) * * Created: 22-Mar-1995 14:51:47 * Author: Bodin Dresevic [BodinD] * * test some multilingual win95 apis \**************************************************************************/ #include "precomp.h" #pragma hdrstop VOID vDisplayFontSignature(FONTSIGNATURE *pfs) { DbgPrint("pfs->fsUsb[0] = 0x%lx\n", pfs->fsUsb[0]); DbgPrint("pfs->fsUsb[1] = 0x%lx\n", pfs->fsUsb[1]); DbgPrint("pfs->fsUsb[2] = 0x%lx\n", pfs->fsUsb[2]); DbgPrint("pfs->fsUsb[3] = 0x%lx\n", pfs->fsUsb[3]); DbgPrint("pfs->fsCsb[0] = 0x%lx\n", pfs->fsCsb[0]); DbgPrint("pfs->fsCsb[1] = 0x%lx\n", pfs->fsCsb[1]); } void vDisplayCharsetInfo(CHARSETINFO *pcsi) { DbgPrint("\nCharsetInfo:\n"); DbgPrint("ciCharset = 0x%lx = %ld\n", pcsi->ciCharset, pcsi->ciCharset); DbgPrint("ciACP = 0x%lx = %ld\n", pcsi->ciACP, pcsi->ciACP); vDisplayFontSignature(&pcsi->fs); } #define NCHARSETS 14 #define CHARSET_ARRAYS UINT nCharsets = NCHARSETS; UINT charsets[] = { ANSI_CHARSET, SHIFTJIS_CHARSET, HANGEUL_CHARSET, JOHAB_CHARSET, GB2312_CHARSET, CHINESEBIG5_CHARSET, HEBREW_CHARSET, ARABIC_CHARSET, GREEK_CHARSET, TURKISH_CHARSET, BALTIC_CHARSET, EASTEUROPE_CHARSET, RUSSIAN_CHARSET, THAI_CHARSET }; UINT codepages[] ={ 1252, 932, 949, 1361, 936, 950, 1255, 1256, 1253, 1254, 1257, 1250, 1251, 874 }; DWORD fs[] = { FS_LATIN1, FS_JISJAPAN, FS_WANSUNG, FS_JOHAB, FS_CHINESESIMP, FS_CHINESETRAD, FS_HEBREW, FS_ARABIC, FS_GREEK, FS_TURKISH, FS_BALTIC, FS_LATIN2, FS_CYRILLIC, FS_THAI }; VOID vTestWin95Apis(HWND hwnd, HDC hdc, RECT* prcl) { CHOOSEFONT cf; /* common dialog box structure */ LOGFONT lf; /* logical-font structure */ HFONT hfont; /* new logical-font handle */ HFONT hfontOld; /* original logical-font handle */ HFONT hfntTmp, hfntOldTmp; COLORREF crOld; /* original text color */ TEXTMETRICW tmw; LONG lHt, y; UCHAR achText[10] = {65, 66, 122, 123, 187, 188, 200, 201, 254, 255}; int i; // font language info DWORD dwFontLangInfo; // args for GetTextCharsetInfo int iTextCharsetInfo; FONTSIGNATURE fsig; // translate charset info: BOOL bRet; CHARSETINFO csi; DWORD *lpSrc; DWORD afs[2]; SIZE sz; PSZ apszCharsets[] = { "ANSI_CHARSET ", "SHIFTJIS_CHARSET ", "HANGEUL_CHARSET ", "JOHAB_CHARSET ", "GB2312_CHARSET ", "CHINESEBIG5_CHARSET", "HEBREW_CHARSET ", "ARABIC_CHARSET ", "GREEK_CHARSET ", "TURKISH_CHARSET ", "BALTIC_CHARSET ", "EASTEUROPE_CHARSET ", "RUSSIAN_CHARSET ", "THAI_CHARSET " }; cf.lStructSize = sizeof (CHOOSEFONT); cf.hwndOwner = hwnd; cf.lpLogFont = &lf; cf.Flags = CF_SCREENFONTS | CF_EFFECTS | CF_FORCEFONTEXIST; cf.rgbColors = RGB(255, 0, 0); cf.nFontType = SCREEN_FONTTYPE; /* * Display the dialog box, allow the user to * choose a font, and render the text in the * window with that selection. */ if (!ChooseFont(&cf)) { DbgPrint("Font selection failed\n"); return; } crOld = SetTextColor(hdc, cf.rgbColors); // Hack, the way to specify the size hfont = CreateFontIndirect(&lf); hfontOld = SelectObject(hdc, hfont); GetTextMetricsW(hdc,&tmw); lHt = tmw.tmHeight + 10; // add little bit to be safe; GetTextExtentPointA(hdc, apszCharsets[4], strlen(apszCharsets[4]), &sz); // start testing dwFontLangInfo = GetFontLanguageInfo(hdc); DbgPrint("dwFontLangInfo = 0x%lx\n", dwFontLangInfo); iTextCharsetInfo = GetTextCharsetInfo(hdc, &fsig, 0); DbgPrint("\n\n GetTextCharsetInfo = 0x%lx\n", iTextCharsetInfo); vDisplayFontSignature(&fsig); DbgPrint("\n\n vDisplayCharsetInfo: TCI_SRCFONTSIG\n\n"); DbgPrint("Listing supported windows code pages:\n"); afs[1] = 0; // null out oem code pages; for (i = 0; i < 32; i++) { afs[0] = fsig.fsCsb[0] & (DWORD)(1 << i); // single out one bit: bRet = TranslateCharsetInfo(afs, &csi, TCI_SRCFONTSIG); if (bRet) vDisplayCharsetInfo(&csi); } DbgPrint("\n\n vDisplayCharsetInfo: TCI_SRCCHARSET\n\n"); for (i = 0,y = 10; i < sizeof(charsets)/sizeof(charsets[0]); i++, y+=lHt) { lpSrc = (DWORD *)charsets[i]; bRet = TranslateCharsetInfo(lpSrc, &csi, TCI_SRCCHARSET); ASSERTGDI(csi.fs.fsCsb[0] == fs[i], "fsCsb wrong!!!?\n"); DbgPrint("TranslateCharsetInfo(0x%lx, TCI_SRCCHARSET)\n",charsets[i]); vDisplayCharsetInfo(&csi); // display our sample string in this charset: lf.lfCharSet = charsets[i]; hfntTmp = CreateFontIndirect(&lf); hfntOldTmp = SelectObject(hdc, hfntTmp); TextOutA(hdc, 10, y, apszCharsets[i], strlen(apszCharsets[i])); TextOutA(hdc, 10 + sz.cx + 10, y, achText, sizeof(achText)); SelectObject(hdc, hfntOldTmp); DeleteObject(hfntTmp); } DbgPrint("\n\n vDisplayCharsetInfo: TCI_SRCCODEPAGE\n\n"); for (i = 0; i < sizeof(codepages)/sizeof(codepages[0]); i++) { lpSrc = (DWORD *)codepages[i]; bRet = TranslateCharsetInfo(lpSrc, &csi, TCI_SRCCODEPAGE); ASSERTGDI(csi.fs.fsCsb[0] == fs[i], "fsCsb wrong!!!?\n"); DbgPrint("TranslateCharsetInfo(0x%lx, TCI_SRCCODEPAGE)\n",codepages[i]); vDisplayCharsetInfo(&csi); } SelectObject(hdc, hfontOld); DeleteObject(hfont); }