unreal3控制台窗口属性调整

在windows平台上,unreal3的console窗口类是FOutputDeviceConsoleWindows

启动时,它可以从XXXGame.ini中读取诸如窗口大小之类的属性,具体的代码在

void FOutputDeviceConsoleWindows::Show( UBOOL ShowWindow )

中,第一次Show时创建console,分别读取了x,y,w,h四个属性,通过SetConsoleScreenBufferSize/SetWindowPos设置到console窗口上。

实用中碰到两个问题:

1、窗口的大小和屏幕缓冲区大小不一致,导致输出的字符串不能自动换行,总是要拖滚横向滚动条才能看完全部

2、手动修改窗口的位置和大小后,并没有保存到配置文件中,每次启动又要重设

解决办法如下:

1、在FOutputDeviceConsoleWindows::Show里增加设置窗口大小的代码

SMALL_RECT rect = {};
rect.Right = ConsoleWidth - 1;
rect.Bottom = 30;
BOOL b = ::SetConsoleWindowInfo(ConsoleHandle, TRUE, &rect);

因为它原来只设了屏幕缓冲区,没有设窗口,现成将窗口宽度改成跟缓冲区一样(实际小1,MS规定的),就不用横向滚动了。高度30纯手打,可根据自己需要调整,读取原高度也可以。

2、这个问题的原因是,表示控制台窗口的变量是个全局静态变量:

static FOutputDeviceConsoleWindows            LogConsole

它的SaveToINI函数是在析构中调用,全局静态变量的析构函数实际是在main函数之后才被调用的,那时表示配置文件的GConfig早就先销毁了(在appExit<-WinMain中),在SaveToINI时发现GConfig没有,自然写不了配置。

解决办法是在合适的时机手动调用SaveToINI,然后这函数是子类的(通常也就windows用ini吧),基类上并没有。但没关系,基类FOutputDevice上有个TearDown虚函数,正适合来做此类清理操作。

首先在FOutputDeviceConsoleWindows中重载TearDown,调用SaveToINI。

然后在FOutputDeviceConsoleWindowsInherited中也重载TearDown,调用其链接的目标设备ForwardConsole的TearDown即可!

至于为啥有FOutputDeviceConsoleWindowsInherited这个类以及链接是干啥用的,现在还没体会清楚,但保存控制台属性的目的,已经达到了~

原文地址:https://www.cnblogs.com/wellbye/p/5330417.html