C++ SetCurrentConsoleFontEx()不适用于自定义安装的字体
我在我的环境Pixel Operator Mono上安装了一种自定义字体,我正在开发一些需要这种字体的控制台应用程序。这是我的职责:C++ SetCurrentConsoleFontEx()不适用于自定义安装的字体,c++,c++11,winapi,visual-c++,C++,C++11,Winapi,Visual C++,我在我的环境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;
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似乎可以很好地工作。但像素运营商Mono没有。该字体显示在我的CMD属性上,我甚至可以设置为默认字体。但为什么我不能这样改变呢?我已经检查过了,SetCurrentConsoleFontEx正在返回成功
编辑1:
我使用这个函数来获取字符串形式的错误。但我可以看到errorMessageId总是为0。我在SetCurrentConsoleFontEx调用之后立即调用此函数
首先确保自定义字体和其他普通字体位于同一代码页(通常为437)中,可以通过设置
接下来,对于的设置,尝试修改为FF_MODERN,函数返回1,GetLastError返回0。这应该意味着没有错误。正如我们愿意相信你的话,10个开发人员中有9个错误报告。显示错误处理代码。编辑帖子以添加错误处理代码。错误处理代码仍然丢失。
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;
}
#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;
}