フォントには と のどちらの文字もありCalibri
ませんが、最初の文字は他のフォントを使用して印刷されます。ただし、文字は無効な文字コードとして表示されます。文字コードで行ったのと同じように、この最後の文字を印刷するためにフォントを置き換えないのはなぜですか?0x062A
0x660E
0x660E
TextOut()
0x062A
Calibri
フォントを に置き換えてもArial
、結果は同じです。
編集 : また、この文に注意を向けたいと思います。この文はhttp://msdn.microsoft.com/en-us/goglobal/bb688134.aspxにあります。「Windows コア フォント (Times New Roman、Courier New 、Arial、Microsoft Sans Serif、および Tahoma など) には、ラテン語、ヘブライ語、アラビア語、ギリシャ語、およびキリル文字が含まれていますが、東アジアのスクリプト文字は含まれていません。これらすべてのフォントでコードを試してみましたが、結果はまったく同じでした。文字 0x660E は無効にレンダリングされます。
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, UINT wParam, LONG lParam)
{
static HFONT s_hFont;
switch( message )
{
case WM_CREATE:
{
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT));
lf.lfHeight = -MulDiv(20, 96, 72);
lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
wcscpy_s(lf.lfFaceName, LF_FACESIZE, L"Calibri");
if( !(s_hFont = CreateFontIndirect(&lf)) ) return -1;
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(hwnd, &ps);
s_hFont = (HFONT)SelectObject(ps.hdc, s_hFont);
wchar_t wchar1 = 0x062A; // Arabic character
TextOut(ps.hdc, 10, 10, &wchar1, 1);
wchar_t wchar2 = 0x660E; // Japanese character
TextOut(ps.hdc, 10, 50, &wchar2, 1);
s_hFont = (HFONT)SelectObject(ps.hdc, s_hFont);
EndPaint(hwnd, &ps);
}
break;
case WM_DESTROY:
DeleteObject(s_hFont);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0L ;
}
出力のスクリーンショット