WCHAR MBCharToUnicode(UINT MBChar) { WCHAR WideChar; DWORD CodePage; CodePage = CP_GB2312; MBChar &= 0xFFFF; if (MBChar & 0xFF00) { if (IsShiftJISChar(MBChar)) CodePage = CP_SHIFTJIS; MBChar = SWAPCHAR(MBChar); } MultiByteToWideChar( CodePage, 0, (LPSTR)&MBChar, 2, (LPWSTR)&WideChar, sizeof(WideChar) / sizeof(WCHAR)); return WideChar; }
DWORD WINAPI MyGetGlyphOutlineA(HDC hDC, UINT uChar, UINT uFormat, LPGLYPHMETRICS lpgm, DWORD cbBuffer, LPVOID lpvBuffer, CONST MAT2 *lpmat2) { CHAR cHighByte; UINT CodePage, wChar; HFONT hFont = NULL; DWORD dwIndex; TEXTMETRICW tm; do { uChar &= 0xFFFF; cHighByte = HIBYTE(uChar); CodePage = 936; if (cHighByte < 0) { if (IsShiftJISChar(uChar)) { MYAPI(GetTextMetricsW)(hDC, &tm); dwIndex = tm.tmHeight > 10; CodePage = 932; // hFont = g_hFontJP[dwIndex]; if (hFont) hFont = (HFONT)MYAPI(SelectObject)(hDC, hFont); } uChar = HIBYTE(uChar)|(LOBYTE(uChar) << 8); } MYAPI(MultiByteToWideChar)(CodePage, 0, (LPCSTR)&uChar, 2, (LPWSTR)&wChar, 1); } while (0); CodePage = MYAPI(GetGlyphOutlineW)(hDC, wChar, uFormat, lpgm, cbBuffer, lpvBuffer, lpmat2); /* if (hFont) { SelectObject(hDC, hFont); } */ return CodePage; }
BOOL WINAPI MyTextOutA(HDC hDC, int nXStart, int nYStart, LPCTSTR lpString, int cbCount) { BOOL r; WCHAR c, ch[0x100]; ULONG CodePage; CodePage = CP_GB2312; if (cbCount > 2 && IsShiftJISString((PCHAR)lpString, cbCount)) { CodePage = CP_SHIFTJIS; } else if (cbCount == 2) { c = *(PWCHAR)lpString; switch (c) { case SWAPCHAR('‘Ρ'): ch[0] = 0x266A; goto SKIP_CONV; default: if (IsShiftJISChar(SWAPCHAR(c))) CodePage = CP_SHIFTJIS; goto NOT_CHANGE_CHAR; } } NOT_CHANGE_CHAR: CodePage = MultiByteToWideChar(CodePage, 0, lpString, cbCount, ch, countof(ch)); SKIP_CONV: r = TextOutW(hDC, nXStart, nYStart, ch, CodePage); return r; }