如何在GDI应用程序中绘制Windows控制台使用的光栅字体?例如,如屏幕截图所示,为8x8固定字体。
可以通过CreateFont()API使用这些字体,还是Windows可以通过某些特殊方式加载这些字体?
答案 0 :(得分:1)
控制台使用"fixed width fonts"
,例如"Courier New"
(在所有Windows版本中可用)或"Consolas"
(从Vista开始可用)。
固定宽度的字体不一定是栅格。要使用光栅字体,请枚举字体以找到诸如"Terminal"
或"Fixedsys"
之类的光栅字体。您必须使用正确的大小(例如,"Terminal"
字体为18),否则Windows可能会替换为其他字体并调整大小。 DPI设置也存在问题。如果程序不支持DPI,则工作站的DPI设置较高时会放大。
case WM_PAINT:
{
PAINTSTRUCT ps;
auto hdc = BeginPaint(hwnd, &ps);
auto hfont = CreateFont(-18, 0, 0, 0, 0, 0, 0, 0,
ANSI_CHARSET,
OUT_DEVICE_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH,
L"Terminal");
auto oldfont = SelectObject(hdc, hfont);
RECT rc = { 0,0,100,300 };
DrawText(hdc, L"Test 123", -1, &rc, DT_LEFT | DT_TOP);
SelectObject(hdc, oldfont);
DeleteObject(hfont);
EndPaint(hwnd, &ps);
return 0;
}
答案 1 :(得分:0)
答案类似于Barmak的答案,不同之处在于宽度和高度都被指定了,因此要为8x8光栅字体创建字体,我使用以下代码:
hfont = CreateFont(-8, -8, 0, 0, 0, 0, 0, 0, OEM_CHARSET, OUT_DEVICE_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, _T("Terminal"));
具体地说,必须选择高度和宽度,并必须指定OEM_CHARSET字符集,以便选择一种光栅字体。
我的意图是渲染到DirectDraw表面(IDirectDrawSurface7::GetDC()
),然后将该表面绘制到主要表面,如下所示:
通过涉及多次通过的一些技巧,我为文本添加了一些阴影效果,但这超出了我最初提出的问题的范围。