U+E849 のコードを問題なく使用することは難しいようです。
WordなどはUnicodeの私用領域をフォントファイルから取り込まず、外字ファイルからだけ取り込むようにしているようです。
一部のアプリは、フォントファイルに無い場合だけ外字ファイルから取り込むようにしているようです。(もう少し複雑かもしれません)
以下のような対応が考えられます。
方法1)
Unicodeで使える文字がないか調べて使う。(IMEパッドの手書き入力)
方法2)
私用領域の文字未登録のコードで外字を登録する。
以上の方法は既存の文書の文字コードの書き換えが必要になります。
■ 表示できないアプリがあることを許容してU+E849 のコードを使う。
方法3)
質問にあるように Direct2D を使用するようにプログラムを修正する。
方法4)
外字ファイルのフォントで TextOutW で出力する。
外字ファイルにないコードはシステムのデフォルトフォントが使用されるので、フォントを指定できない。
描画部分のコード例(Copilotに聞きました)
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// 外字フォントファイルをロード
const TCHAR* fontPath = L"C:\\Windows\\FONTS\\EUDC.TTE";
if (AddFontResourceEx(fontPath, FR_PRIVATE, NULL) == 0) {
MessageBox(hWnd, L"フォントのロードに失敗しました", L"エラー",
MB_OK | MB_ICONERROR);
return -1;
}
// 描画するテキスト(外字を含む)
TCHAR text[] = L"あ\uE849";
// EUDCフォントを作成
HFONT hFont = CreateFont(
24, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"EUDC");
// フォントを選択
HFONT hOldFont = (HFONT)SelectObject(hdc, hFont);
// テキストを描画
TextOut(hdc, 100, 50, text, ARRAYSIZE(text));
// フォントを元に戻す
SelectObject(hdc, hOldFont);
DeleteObject(hFont);
ReleaseDC(hWnd, hdc);
// 外字フォントファイルをメモリから削除
RemoveFontResourceEx(fontPath, FR_PRIVATE, NULL);
EndPaint(hWnd, &ps);
} break;
※ (参考).Net の FormattedText では下記のようにフォントと外字ファイルを同時に指定できます。
new FontFamily("MS ゴシック, C:\\Windows\\Fonts\\EUDC.tte#EUDC"),
外字についての資料が少ないので、とりあえず、考え付いたことです。
ご参考になれば幸いです。