【发布时间】:2011-12-12 23:20:58
【问题描述】:
我正在玩一些 OpenGL,使用 SDL 来处理窗口/输入等。目前我正在向 HUD 显示我想看到的任何信息。好吧,这太麻烦了,我想知道是否有一种简单的方法可以打开一个单独的控制台窗口来向我报告这些信息。我还是 C++ 的新手,所以如果这很明显的话,请放轻松。
【问题讨论】:
我正在玩一些 OpenGL,使用 SDL 来处理窗口/输入等。目前我正在向 HUD 显示我想看到的任何信息。好吧,这太麻烦了,我想知道是否有一种简单的方法可以打开一个单独的控制台窗口来向我报告这些信息。我还是 C++ 的新手,所以如果这很明显的话,请放轻松。
【问题讨论】:
以下代码适用于 Windows。我总是觉得保持按需创建控制台窗口的能力很方便:
int hConHandle;
intptr_t lStdHandle;
CONSOLE_SCREEN_BUFFER_INFO coninfo;
FILE *fp;
// allocate a console for this app
AllocConsole();
// set the screen buffer to be big enough to let us scroll text
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
coninfo.dwSize.Y = 500;
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);
// redirect unbuffered STDOUT to the console
lStdHandle = (intptr_t)GetStdHandle(STD_OUTPUT_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen( hConHandle, "w" );
*stdout = *fp;
setvbuf( stdout, NULL, _IONBF, 0 );
// redirect unbuffered STDIN to the console
lStdHandle = (intptr_t)GetStdHandle(STD_INPUT_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen( hConHandle, "r" );
*stdin = *fp;
setvbuf( stdin, NULL, _IONBF, 0 );
// redirect unbuffered STDERR to the console
lStdHandle = (intptr_t)GetStdHandle(STD_ERROR_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen( hConHandle, "w" );
*stderr = *fp;
setvbuf( stderr, NULL, _IONBF, 0 );
// make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog point to console as well
std::ios::sync_with_stdio();
//Keep our window in focus
SetForegroundWindow(m_hWnd); // Slightly Higher Priority
SetFocus(m_hWnd); // Sets Keyboard Focus To The Window
此代码假定HWND 位于名为m_hWnd 的变量中;它是从我使用的类包装器中复制而来的。但是,如何从 SDL 获得 HWND 取决于您自己。
要释放控制台,请调用:
FreeConsole();
AllocConsole 和 FreeConsole 是 Win32 API 函数。
【讨论】:
在项目属性中的 Linker -> System 中,检查 SubSystem 是否为“Console (/SUBSYSTEM:CONSOLE)”。这会导致在您运行程序时弹出一个单独的控制台窗口。如果您当前的入口点不是main,那么如果您这样做,则需要将其更改为该入口点。
【讨论】:
如果您从命令行运行并使用printf(),您应该会看到消息已注销到终端窗口。否则,您可以登录到文件并在 *nix 样式框上使用 tail -f 来查看显示的输出。
您使用的是什么环境?大多数 IDE 也会在其调试输出窗口中显示此输出。
【讨论】: