使用 winapi 启用 ClearType 字体
Enable ClearType fonts with the winapi
我正在尝试在卑鄙的编辑器 GUI 模式下将 ClearType 添加到字体 "winvile"。我不熟悉代码。
我搜索了所有 LOGFONT
结构并在 ntwinio.c and w32cmd.c
中找到了一些
我找不到任何其他带有 LOGFONT
的地方,所以我只是尝试在初始化结构的地方添加 CLEARTYPE_QUALITY
(docs)。结束于:
diff --git a/ntwinio.c b/ntwinio.c
index 4b73176..c3a9871 100644
--- a/ntwinio.c
+++ b/ntwinio.c
@@ -848,6 +848,7 @@ GetMyFont(VIDEO_ATTR attr)
LOGFONT logfont = vile_logfont;
logfont.lfItalic = (BYTE) ((attr & VAITAL) != 0);
logfont.lfUnderline = (BYTE) ((attr & VAUL) != 0);
+ logfont.lfQuality = CLEARTYPE_QUALITY;
if (attr & VABOLD)
logfont.lfWeight = FW_SEMIBOLD;
if ((MyFonts[n].font = CreateFontIndirect(&logfont)) != 0) {
@@ -1218,6 +1219,7 @@ set_font(void)
vile_logfont.lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
vile_logfont.lfCharSet = ANSI_CHARSET;
+ vile_logfont.lfQuality = CLEARTYPE_QUALITY;
TRACE(("LOGFONT Facename:%s\n", vile_logfont.lfFaceName));
if (ChooseFont(&choose)) {
@@ -1346,6 +1348,7 @@ ntwinio_font_frm_str(const char *fontstr,
/* Build up LOGFONT data structure. */
memset(&logfont, 0, sizeof(logfont));
logfont.lfWeight = (str_rslts.bold) ? FW_BOLD : FW_NORMAL;
+ logfont.lfQuality = CLEARTYPE_QUALITY;
logfont.lfHeight = -MulDiv(str_rslts.size,
GetDeviceCaps(hdc, LOGPIXELSY),
72);
diff --git a/w32cmd.c b/w32cmd.c
index 50276af..e9223ad 100644
--- a/w32cmd.c
+++ b/w32cmd.c
@@ -1626,6 +1626,7 @@ w32_init_logfont(LOGFONT * logfont, FONTSTR_OPTIONS * str_rslts, int height)
logfont->lfWeight = (str_rslts->bold) ? FW_BOLD : FW_NORMAL;
logfont->lfHeight = height;
+ logfont->lfQuality = CLEARTYPE_QUALITY;
if (str_rslts->italic)
logfont->lfItalic = TRUE;
与 cmd.exe 相比,这似乎不起作用,字体看起来仍然很糟糕:
我也尝试了其他质量设置,它们对我来说都是一样的。我是不是在 winapi 调用中遗漏了什么,或者可能误解了 ClearType 的工作原理?
我在 Windows 10.Visual Studio 2010 Express 上构建。
不是 ClearType,而是 winvile.exe
的兼容性 DPI 设置。感谢 IInspectable 的指点。
我正在尝试在卑鄙的编辑器 GUI 模式下将 ClearType 添加到字体 "winvile"。我不熟悉代码。
我搜索了所有 LOGFONT
结构并在 ntwinio.c and w32cmd.c
我找不到任何其他带有 LOGFONT
的地方,所以我只是尝试在初始化结构的地方添加 CLEARTYPE_QUALITY
(docs)。结束于:
diff --git a/ntwinio.c b/ntwinio.c
index 4b73176..c3a9871 100644
--- a/ntwinio.c
+++ b/ntwinio.c
@@ -848,6 +848,7 @@ GetMyFont(VIDEO_ATTR attr)
LOGFONT logfont = vile_logfont;
logfont.lfItalic = (BYTE) ((attr & VAITAL) != 0);
logfont.lfUnderline = (BYTE) ((attr & VAUL) != 0);
+ logfont.lfQuality = CLEARTYPE_QUALITY;
if (attr & VABOLD)
logfont.lfWeight = FW_SEMIBOLD;
if ((MyFonts[n].font = CreateFontIndirect(&logfont)) != 0) {
@@ -1218,6 +1219,7 @@ set_font(void)
vile_logfont.lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
vile_logfont.lfCharSet = ANSI_CHARSET;
+ vile_logfont.lfQuality = CLEARTYPE_QUALITY;
TRACE(("LOGFONT Facename:%s\n", vile_logfont.lfFaceName));
if (ChooseFont(&choose)) {
@@ -1346,6 +1348,7 @@ ntwinio_font_frm_str(const char *fontstr,
/* Build up LOGFONT data structure. */
memset(&logfont, 0, sizeof(logfont));
logfont.lfWeight = (str_rslts.bold) ? FW_BOLD : FW_NORMAL;
+ logfont.lfQuality = CLEARTYPE_QUALITY;
logfont.lfHeight = -MulDiv(str_rslts.size,
GetDeviceCaps(hdc, LOGPIXELSY),
72);
diff --git a/w32cmd.c b/w32cmd.c
index 50276af..e9223ad 100644
--- a/w32cmd.c
+++ b/w32cmd.c
@@ -1626,6 +1626,7 @@ w32_init_logfont(LOGFONT * logfont, FONTSTR_OPTIONS * str_rslts, int height)
logfont->lfWeight = (str_rslts->bold) ? FW_BOLD : FW_NORMAL;
logfont->lfHeight = height;
+ logfont->lfQuality = CLEARTYPE_QUALITY;
if (str_rslts->italic)
logfont->lfItalic = TRUE;
与 cmd.exe 相比,这似乎不起作用,字体看起来仍然很糟糕:
我也尝试了其他质量设置,它们对我来说都是一样的。我是不是在 winapi 调用中遗漏了什么,或者可能误解了 ClearType 的工作原理?
我在 Windows 10.Visual Studio 2010 Express 上构建。
不是 ClearType,而是 winvile.exe
的兼容性 DPI 设置。感谢 IInspectable 的指点。