我有一些文字要写到Windows控制台,我需要知道in列的实际宽度. wcswidth_l似乎是拥有它的平台上的最佳选择(尽管mbswidth_l()会更好,因为我不想使用wchar_t,但由于某种原因它并不存在).但是除了其他平台,我还需要在Windows上可以运行的东西.尽管不太可能有便携式解决方案,但我对Windows上的任何解决方案一无所知.我认为控制台具有用于获取光标位置等的API,因此我可以将文本写出来并检查位置的变化.我猜那是准确的,但是写出额外的输出根本是不可接受的.
如何在Windows上获取字符串或字符的列宽?
编辑:
wcswidth_l返回用于显示字符串的控制台列数.一些字符占据一列,而另一些则占据一列.日语字符,占两个.
例如,“ aあ”的“列宽”为四. “ a”是一个,“”是一个,而“あ”是两个. (假设控制台设置为实际显示非ASCII字符).如果API使用代码页65001(UTF-8)支持字符串,那也很好.
解决方法:
首先,Windows控制台API位于here.
其次,您要查找的功能是GetConsoleFontSize吗?
我将尝试快速输入示例.
编辑:在这里你去.如果有一个小错误,请原谅我.我实际上发现它甚至更容易. GetCurrentConsoleFont在获取索引以将其传递给GetConsoleFontSize的方式上填写了一个COORD结构,因此保存了步骤:)
#define _WIN32_WINNT 0x0501 //XP, 0x0601=windows 7
#include <windows.h>
int main()
{
HANDLE hStdOutput = GetStdHandle (STD_OUTPUT_HANDLE);
CONSOLE_FONT_INFO cfi;
GetCurrentConsoleFont (hStdOutput, FALSE, &cfi);
//cfi.dwFontSize.X == x size
//cfi.dwFontSize.Y == y size
}
编辑:
如果您不介意不可见的输出,则可以使用CreateConsoleScreenBuffer在您的命令中几乎拥有一个不可见的控制台窗口,同时不影响您的显示. GetConsoleScreenBufferInfoEx会告诉您光标的位置,此时您可以使用WriteConsole写入缓冲区(不可见),然后再次检查光标位置与实际写入的字符数.请注意,事先检查光标位置不需要清除屏幕即可使用此方法.