代码之家  ›  专栏  ›  技术社区  ›  dutt

在C++控制台应用程序中使用Unicode字体

  •  8
  • dutt  · 技术社区  · 16 年前

    如何更改我的C++ Windows控制台应用程序中的字体?

    它似乎没有使用cmd.exe默认使用的字体(Lucida控制台)。当我通过现有cmd.exe(键入name.exe)运行我的应用程序时,它如下所示: http://dathui.mine.nu/konsol3.png 但是当我单独运行我的应用程序时(双击.exe),它看起来是这样的: http://dathui.mine.nu/konsol2.png . 相同的代码,两种不同的外观。

    因此,现在我想知道如何更改字体,使其无论如何运行都始终正确显示。


    好的,更多的信息。当我使用这个小片段时:

    SetConsoleOutputCP(CP_UTF8);
    wchar_t s[] = L"èéøÞǽлљΣæča";
    int bufferSize = WideCharToMultiByte(CP_UTF8, 0, s, -1, NULL, 0, NULL, NULL);
    char* m = new char[bufferSize]; 
    WideCharToMultiByte(CP_UTF8, 0, s, -1, m, bufferSize, NULL, NULL);
    wprintf(L"%S", m);
    

    它使用正确的字体。但在我的实际应用中,我使用 WriteConsoleOutput()

    CHAR_INFO* info = new CHAR_INFO[mWidth * mHeight];
    for(unsigned int a = 0; a < mWidth*mHeight; ++a) {
        info[a].Char.UnicodeChar = mWorld.getSymbol(mWorldX + (a % mWidth), mWorldY + (a / mWidth));
        info[a].Attributes = mWorld.getColour(mWorldX + (a % mWidth), mWorldY + (a / mWidth));
    }
    COORD zero;
    zero.X = zero.Y = 0;
    COORD buffSize;
    buffSize.X = mWidth;
    buffSize.Y = mHeight;
    if(!WriteConsoleOutputW(window, info, buffSize, zero, &rect)) {
        exit(-1);
    }
    

    然后它使用了错误的字体。我使用两个不同的窗口,创建方式如下:

    mHandleA = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0,
                                         NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
    

    我可能只是为标准输出或其他东西设置代码页?

    3 回复  |  直到 12 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    对于Vista及以上版本,有 SetCurrentConsoleFontEx said .

    对于2K和XP,有一个未记录的函数 SetConsoleFont ; e、 g.阅读 here

    typedef BOOL (WINAPI *FN_SETCONSOLEFONT)(HANDLE, DWORD);
    FN_SETCONSOLEFONT SetConsoleFont;
    ..........
    HMODULE hm = GetModuleHandle(_T("KERNEL32.DLL"));
    SetConsoleFont = (FN_SETCONSOLEFONT) GetProcAddress(hm, "SetConsoleFont");
    // add error checking
    ..........
    
    SetConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), console_font_index);
    

    现在, console_font_index 是控制台字体表的索引,其定义未知。然而, console_font_index == 10 已知可识别Lucida控制台(Unicode字体)。我不确定这个值在不同的OS版本中有多稳定。

    在dutt的评论之后,我在一个干净的XP SP2设置上运行了一个实验。

    • 在我打开一个控制台并在其属性中选择Lucida字体后(仅一次;我可以在打开后立即关闭它,但效果是一样的),突然GetNumberOfConsoleFonts()开始返回12,索引10和11选择不同大小的Lucida。

    所以当我玩它的时候,这个技巧似乎对我有效,因为我总是至少运行一个选择了Lucida字体的控制台应用程序。

    因此,出于实际目的, jon hanson's answer 看起来好多了。除了提供更好的控制之外,它实际上也很有效。:)

        2
  •  4
  •   jon hanson    16 年前

    Windows使用exe路径作为键在注册表中存储cmd设置(包括字体)。根键是“HKEY\U CURRENT\U USER\Console”,因此如果您使用regedit查看,您应该会看到几个以varous exe命名的子键。

    要复制现有exe的设置,可以将密钥导出到文本文件,然后编辑该文件以将密钥名称更改为exe的名称,然后重新导入。

    您还可以通过编程方式修改注册表,尽管我怀疑这会对您的控制台窗口立即生效。

        3
  •  3
  •   Ferruccio    16 年前