SetCurrentConsoleFontEx() 不适用于自定义安装的字体
Posted
技术标签:
【中文标题】SetCurrentConsoleFontEx() 不适用于自定义安装的字体【英文标题】:SetCurrentConsoleFontEx() doesn't work with custom installed fonts 【发布时间】:2020-06-21 12:59:06 【问题描述】:我在我的环境中安装了自定义字体(Pixel Operator Mono),我正在开发一些需要这种字体的控制台应用程序。这是我的功能:
void set_font()
CONSOLE_FONT_INFOEX cfi;
cfi.cbSize = sizeof(cfi);
cfi.nFont = 0;
cfi.dwFontSize.X = 0;
cfi.dwFontSize.Y = 27;
cfi.FontFamily = FF_DONTCARE;
cfi.FontWeight = FW_NORMAL;
std::wcscpy(cfi.FaceName, L"Pixel Operator Mono");
SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi);
使用“Consolas”、“Courier New”甚至“MS Gothic”似乎都可以正常工作。但是“Pixel Operator Mono”没有。该字体显示在我的 CMD 属性中,我什至可以将其设置为默认字体。但是为什么我不能改变这种方式呢?我已经检查过了,SetCurrentConsoleFontEx 正在返回成功。
编辑 1:
我使用此函数将错误作为字符串获取。但是调试我可以看到errorMessageId
总是得到0。我在SetCurrentConsoleFontEx()
调用之后立即调用了这个函数。
std::string GetLastErrorAsString()
//Get the error message, if any.
DWORD errorMessageID = ::GetLastError();
if(errorMessageID == 0)
return std::string(); //No error message has been recorded
LPSTR messageBuffer = nullptr;
size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);
std::string message(messageBuffer, size);
//Free the buffer.
LocalFree(messageBuffer);
return message;
【问题讨论】:
If the function fails, the return value is zero. To get extended error information, callGetLastError
.
函数返回 1,GetLastError 返回 0。应该没有错误。
尽管我们愿意相信您的话,但十分之九的开发人员会收到错误报告。显示您的错误处理代码。
编辑帖子以添加处理内容
错误处理代码仍然缺失。
【参考方案1】:
首先要确保自定义字体和其他普通字体在同一个代码页(一般是437),可以通过SetConsoleOutputCP
设置。
接下来,对于FontFamily
的设置,尝试修改为FF_MODERN << 4 | TMPF_VECTOR | TMPF_TRUETYPE
进行测试。
这里是示例:
#include <iostream>
#include <Windows.h>
using namespace std;
void set_font()
CONSOLE_FONT_INFOEX cfi;
SetConsoleOutputCP(437);
cfi.cbSize = sizeof(CONSOLE_FONT_INFOEX);
cfi.nFont = 0;
cfi.dwFontSize.X = 0;
cfi.dwFontSize.Y = 27;
cfi.FontFamily = FF_MODERN << 4 | TMPF_VECTOR | TMPF_TRUETYPE;
cfi.FontWeight = FW_NORMAL;
wcscpy(cfi.FaceName, L"Pixel Operator Mono");
SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi);
cout << "Hello" << endl;
int main(int argc, const char* argv[])
set_font();
return 0;
【讨论】:
以上是关于SetCurrentConsoleFontEx() 不适用于自定义安装的字体的主要内容,如果未能解决你的问题,请参考以下文章