我整日忙于试图让我的MFC应用程序在屏幕上显示控制台应用程序的日志输出。从Visual Studio 2013向导给我的内容开始,我能够修改他们的代码以将字符串作为输入并生成应用程序消息的运行日志(如下所示):
void COutputWnd::FillBuildWindow(std::string build_text)
{
std::wstring wsTmp(build_text.begin(), build_text.end());
std::wstring z = wsTmp;
LPTSTR x = new TCHAR[z.size() + 1];
_tcscpy(x, z.c_str());
m_wndOutputBuild.AddString(x);
free(x);
}
但是,由于多种原因,我无法从MFC函数外部调用此函数。一是该对象在全局上不可见,二是我在应用程序的控制台部分中使用windows.h,它在MFC中不能很好地播放。
我的许多应用程序已经编写完毕,我正在尝试在其周围放置一个GUI并使用功能区功能。有什么方法可以将cout语句传送到我的MFC应用程序中的消息日志显示中?我今天在Google上搜索了大量内容,但是对于将MFC和控制台代码作为其解决方案一部分的应用程序,找不到任何简单明了的东西。我没有调用单独的可执行文件或dll。这些都被编译为一个独立的exe。
最佳答案
我不了解MFC,但我会从std::streambuf
派生一个类,以将其输出重定向到MFC类,并将生成的流缓冲区安装到std::cout
中。流缓冲区处理写入流的输出,您可以在其overflow()
和sync()
方法中获取已写入的字符:
class windowbuf
: std::streambuf {
SomeHandle handle;
char buffer[256];
public:
typedef std::char_traits<char> traits;
windowbuf(SomeHandle handle): handle(handle) { this->setp(buffer, buffer + 255); }
int overflow(int c) {
if (!traits::eq_int_type(c, traits::eof())) {
*this->pptr() = traits::to_char_type(c);
this->pbump(1);
}
return this->sync() == -1? traits::eof(): traits::not_eof(c);
}
int sync() {
writeToHandle(this->handle, this->pbase(), this->pptr() - this->pbase());
this->setp(buffer, buffer + 255);
return 0;
}
};
上面是一个简单的流缓冲区,当缓冲区已满或流被刷新时,它将在
handle
标识的地方传输字符。我认为应该有一些句柄和一个写函数,将字符转移到MFC窗口,尽管我对此一无所知。要让
std::cout
将其字符发送到上述流缓冲区,您只需要将此流缓冲区安装到std::cout
中,例如,使用int main() {
SomeHandle handle = get_a_handle_from_somewhere();
std::streambuf* cout_rdbuf = std::cout.rdbuf(new windowbuf(handle));
// run your program here
std::cout.rdbuf(cout_rdbuf); // this should really be restored using RAII approaches
}
我认为类似上述方法的东西应该能够弥合一些向
std::cout
编写的代码与使用某种GUI显示信息的代码的其他部分之间的差距。关于c++ - 在同一解决方案中将控制台输出重定向到MFC屏幕输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20204761/