【发布时间】:2010-12-27 16:41:47
【问题描述】:
如何更改我的 C++ Windows 控制台应用程序中的字体?
它似乎没有使用 cmd.exe 默认使用的字体(Lucida 控制台)。当我通过现有的 cmd.exe(键入 name.exe)运行我的应用程序时,它看起来像这样:http://dathui.mine.nu/konsol3.png 这是完全正确的。 但是当我单独运行我的应用程序(双击 .exe)时,它看起来像这样:http://dathui.mine.nu/konsol2.png。 相同的代码,两种不同的外观。
所以现在我想知道如何更改字体,使其无论运行方式如何都始终正确显示。
编辑:
好的,更多信息。当我只使用这个小sn-p时:
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);
我可以只为标准输出设置代码页吗?
【问题讨论】:
-
嗯……很奇怪,有一种方法可以检测控制台与双击的情况,但有一些例外情况。这篇文章是一个好的开始,但还远远不够:codeguru.com/cpp/misc/misc/consoleapps/article.php/c15893
-
你使用哪个编译器?
-
也许跟踪启动代码 - 从 pre main() - 看看哪些代码实际上是在构建控制台窗口本身?我假设编译器/控制台项目提供的 .exe 中必须有代码,用于检测您的应用程序是否已经在控制台中启动,或者是否需要一个,在这种情况下会为您创建一个控制台窗口。这是我的直觉,不是经过研究的事实,但只需几分钟调试就可以验证。此时,您可以看到源代码,并查看您可能需要做什么才能访问该控制台 HWND,以不同方式设置其字体...
-
Ipthnc:听起来像是迂回的方式,但感谢您的提示。 SjB:Visual Studio 2008 教授。 Mordachai:嗯,我在哪里可以找到 pre-main 代码?
标签: c++ winapi unicode fonts console-application