在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这个类以及链接是干啥用的,现在还没体会清楚,但保存控制台属性的目的,已经达到了~