我如何将编程控制台字体设置为Lucida
How do I programatically set console font to Lucida?
lucida Console已在Windows 7上预装了TTF字体,我想在Console应用程序中进行编程设置。
-
由于某种原因,SetCurrentConsolefontex在此范围中甚至没有声明"。i
#include <windows.h>
应该在哪里定义。 -
我将放入console_font_infoex?
-
#define _WIN32_WINNT 0x0601
@alf建议,没有效果
很容易右键单击控制台标题并在此处手动选择字体,但是我宁愿在代码中这样做。
它应该在Windows XP 上运行,我在Windows 7上使用Mingw G 4.8.1。
如果SetCurrentConsoleFontEx
和CONSOLE_FONT_INFOEX
即使在设置_WIN32_WINNT
之后也不存在,则使用过时的SDK。MINGW并不少见
处理Windows上的控制台字体是有问题的,因为控制台将其字体存储在内部数组中。您可能还必须使用一些无证件功能。
在Vista上,后来需要的只是呼叫SetCurrentConsoleFontEx
。问题当然是文档确实很不好,并且CONSOLE_FONT_INFOEX
struct均用于集合和获取功能,而无需告诉您使用了哪些成员。
设置似乎只需要您设置cbSize
和FaceName
,其他所有内容都可以为零:
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_FONT_INFOEX cfie;
ZeroMemory(&cfie, sizeof(cfie));
cfie.cbSize = sizeof(cfie);
lstrcpyW(cfie.FaceName, L"Lucida Console");
SetCurrentConsoleFontEx(hStdOut, false, &cfie);
如果要设置特定的字体大小,则可以设置dwFontSize.Y
。请小心FontFamily
,如果将其设置为错误的值窗口将恢复为默认终端字体。
在vista系统上,您唯一可以在字体数组中访问的是大小:
#if 1 // Using old SDK?
typedef struct _CONSOLE_FONT_INFOEX {
ULONG cbSize;
DWORD nFont;
COORD dwFontSize;
UINT FontFamily;
UINT FontWeight;
WCHAR FaceName[LF_FACESIZE];
} CONSOLE_FONT_INFOEX, *PCONSOLE_FONT_INFOEX;
typedef BOOL (WINAPI*SETCURRENTCONSOLEFONTEX)(HANDLE hConsoleOutput,BOOL bMaximumWindow,CONSOLE_FONT_INFOEX*lpConsoleCurrentFontEx);
SETCURRENTCONSOLEFONTEX SetCurrentConsoleFontEx = (SETCURRENTCONSOLEFONTEX) GetProcAddress(LoadLibraryA("KERNEL32"), "SetCurrentConsoleFontEx");
typedef BOOL (WINAPI*GETCURRENTCONSOLEFONTEX)(HANDLE hConsoleOutput,BOOL bMaximumWindow,CONSOLE_FONT_INFOEX*lpConsoleCurrentFontEx);
GETCURRENTCONSOLEFONTEX GetCurrentConsoleFontEx = (GETCURRENTCONSOLEFONTEX) GetProcAddress(LoadLibraryA("KERNEL32"), "GetCurrentConsoleFontEx");
#endif
static DWORD PrintFontInfoNT4(HANDLE hCon)
{
CONSOLE_FONT_INFO cfi;
BOOL succ = GetCurrentConsoleFont(hCon, false, &cfi);
printf("Get succ=%d nFont=%u dwFontSize=%dx%dn", succ, cfi.nFont, cfi.dwFontSize.X, cfi.dwFontSize.Y);
return succ ? cfi.nFont : -1;
}
static DWORD PrintFontInfoNT6(HANDLE hCon)
{
CONSOLE_FONT_INFOEX cfie;
ZeroMemory(&cfie, sizeof(cfie));
cfie.cbSize = sizeof(cfie);
BOOL succ = GetCurrentConsoleFontEx(hCon, false, &cfie);
printf("GetEx succ=%d nFont=%u size=%dx%d fam=%#x wei=%u name=%lsn", succ, cfie.nFont, cfie.dwFontSize.X, cfie.dwFontSize.Y, cfie.FontFamily, cfie.FontWeight, cfie.FaceName);
return succ ? cfie.nFont : -1;
}
static void TestNT4()
{
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
typedef DWORD (WINAPI*GETNUMBEROFCONSOLEFONTS)();
GETNUMBEROFCONSOLEFONTS GetNumberOfConsoleFonts = (GETNUMBEROFCONSOLEFONTS) GetProcAddress(LoadLibraryA("KERNEL32"), "GetNumberOfConsoleFonts");
typedef BOOL (WINAPI*SETCONSOLEFONT)(HANDLE hConOut, DWORD nFont);
SETCONSOLEFONT SetConsoleFont = (SETCONSOLEFONT) GetProcAddress(LoadLibraryA("KERNEL32"), "SetConsoleFont");
// This is the best you can do on NT/2000/XP/2003 without hacks
DWORD orgFont = PrintFontInfoNT4(hStdOut);
printf("GetNumberOfConsoleFonts=%u orgFont=%un", GetNumberOfConsoleFonts(), orgFont);
for (DWORD i = 0, c = GetNumberOfConsoleFonts(); i < c; ++i)
{
SetConsoleFont(hStdOut, i);
PrintFontInfoNT4(hStdOut);
#if _WIN32_WINNT >= 0x0600
PrintFontInfoNT6(hStdOut);
#endif
Sleep(1000);
}
SetConsoleFont(hStdOut, orgFont); // Restore the original font
}
这是毫无用处的,因为您无法判断要设置的字体。如果您仍然坚持将字体设置在vista Pre-Vista系统上,则必须弄脏手。首先,您需要确定要将更改应用于的终端窗口。
终端默认值存储在HKEY_CURRENT_USERConsole
下,每个应用程序设置可以存储在子密钥中。如果捷径启动了应用程序,则可以覆盖这些默认值。
如果您只想更改正在运行的控制台,那么事情会变得更加困难,但是Windows本身当然知道如何直接设置字体。当您在游戏机菜单中选择"属性"并应用字体更改时,您可以看到此操作。这可能可以从版本变为版本,但我相信它使用映射的内存和秘密消息。您可以通过在WINDBG中设置断点开始调查;正确设置符号后,键入 bp console!Write*
tab enter (如果有多个以上,则将其设置在所有写入功能上)。您将必须弄清楚它正在使用的结构的布局,因此您可能必须在当时应用一个控制台设置并转储/比较内存。
编辑:
看起来有些人已经弄清楚了。此错误分析论文具有一个结构定义,我还找到了实现映射的内存技巧的setConsolepalette函数。ReactOS可能不会使用完全相同的实现,但您也可以查看它。
您仍然需要在具有它的系统上调用SetCurrentConsolefontex,因为内部设备可能在Windows开始使用ConHost.exe时更改。
- C++ wxWidgets:在创建小部件后设置字体
- 从 QFontDatabase 设置 QFont 将所有标签设置为等宽字体?Qt C++
- 如何获取控制面板设置值,如字体大小
- QPlainTextEdit 仅设置一行字体
- 我如何将编程控制台字体设置为Lucida
- 应用字体更改后,丢失样式表设置
- 轮廓字体倒置 - glOrtho() 设置不正确
- 无法在编辑控件上设置字体
- Qt4/PyQt4-无法设置QTextDocument的默认字体
- 如何在Windows日历控件上设置字体
- Win32:设置富编辑的默认字体和文本颜色
- 如何获取样式表设置的Qt中小部件的字体
- 在全屏模式下设置控制台字体大小
- 如何以编程方式将控制台字体设置为“光栅字体”
- QAxObject Excel工作表--为整个Excel工作表设置默认字体
- 使用DEFAULT_GUI_Font设置HFONT的字体大小
- 如何在富编辑中设置字体
- 使用QStandardItemModel的QComboBox样式表设置字体
- 如何在win-api中设置整个应用程序的字体
- 在C++中以编程方式设置 Firemonkey 控件字体