如何将cout输出显示到mfc界面
2017-06-26 18:52
946 查看
最近在做实验室项目,因为某些原因需要在MFC下开发,源码中涉及的COUT输出需要显示。
开始采取的方案一直是在控制台中显示,由于SetWindowText和GetWindowText代替了控制台的流,mfc下不能直接使用cout。
借鉴http://blog.csdn.net/wf6892/article/details/52955935
在MFC中使用cout
文中的方法如下:
1.在MainFrame.h中添加头文件:
2.在MainFrame.h中声明函数:
public:
bool OpenConsole();
3.在MainFrame.cpp中添加函数定义:
bool CMainFrame::OpenConsole()
{
// 保证函数只执行一次
static bool Runed = false;
if (Runed)
return false;
Runed = true;
bool result;
HANDLE hStd;
FILE* fp;
long hFile;
result = AllocConsole();
hStd = GetStdHandle(STD_INPUT_HANDLE);
hFile = (long)_open_osfhandle((intptr_t)hStd, _O_TEXT);
fp = _fdopen(hFile, "r");
(*stdin) = (*fp);
hStd = GetStdHandle(STD_OUTPUT_HANDLE);
hFile = (long)_open_osfhandle((intptr_t)hStd, _O_TEXT);
fp = _fdopen(hFile, "w"); // 注意:必须是可写模式
(*stdout) = (*fp);
hStd = GetStdHandle(STD_ERROR_HANDLE);
hFile = (long)_open_osfhandle((intptr_t)hStd, _O_TEXT);
fp = _fdopen(hFile, "w"); // 注意:必须是可写模式
(*stderr) = (*fp);
cout << "打开控制台成功" << endl;
return result;
}
4.在MainFrame的构造函数中添加
OpenConsole();
5.在要cout的类的头文件中加入如下代码:
#include<iostream>
using namespace std;
该方法能够在MFC控制台中输出代码片中cout和printf的信息!
后面因为需要在UI界面中进行输出,所以不得不另谋他路,使用的方法是直接从流中读取数据进行输出,这里说明一下,我的控件是多行文本,如果出现字符串闪动或者太长的话,可以参考这篇博客http://blog.csdn.net/jinhill/article/details/6180321
VC编辑框追加字符串并自动滚屏功能
在UI界面输出
首先建立一个头文件
log.h
在XXX.H中添加:
public:
static void update(const char* text, std::streamsize count, void* log_widget_ptr);
void show(const char* text, std::streamsize count, void* log_widget_ptr);
private:
static Reconstruction * res
在XXX.CPP中添加:
需要在XXX类构造函数中添加
res = this;
cout_redirector_ = new StandardOutputRedirector<char, std::char_traits<char>>(std::cout, update, this);另外需要添加
XXX* XXX::res;
void XXX::update(const char* text, std::streamsize count, void* log_widget_ptr) {
res->show(text, count, log_widget_ptr);
}
void XXX::show(const char* text, std::streamsize count, void* log_widget_ptr) {
std::string text_str;
for (std::streamsize i = 0; i < count; ++i) {
if (text[i] == '\n') {
text_str += "\n";
}
else {
text_str += text[i];
}
}
CEdit *pEt = (CEdit *)GetDlgItem(LOG_EDIT);
int nLength = pEt->SendMessage(WM_GETTEXTLENGTH);
pEt->SetSel(nLength, nLength);
pEt->ReplaceSel(text_str.c_str());
pEt->LineScroll(pEt->GetLineCount());
}之所以会使用到两个函数和一个静态变量,是因为出现的静态函数调用非静态成员函数或变量带来的问题,如果要对文本框进行赋值显示,必须先声明及实例化一个对象才可以,因此为了避免这点带来的问题,特意先声明一个静态变量和非静态成员函数。
如上,就应该可以在LOG_EDIT文本框中得到COUT的输出了
开始采取的方案一直是在控制台中显示,由于SetWindowText和GetWindowText代替了控制台的流,mfc下不能直接使用cout。
借鉴http://blog.csdn.net/wf6892/article/details/52955935
在MFC中使用cout
文中的方法如下:1.在MainFrame.h中添加头文件:
#include <io.h> #include <fcntl.h>
2.在MainFrame.h中声明函数:
public:
bool OpenConsole();
3.在MainFrame.cpp中添加函数定义:
bool CMainFrame::OpenConsole()
{
// 保证函数只执行一次
static bool Runed = false;
if (Runed)
return false;
Runed = true;
bool result;
HANDLE hStd;
FILE* fp;
long hFile;
result = AllocConsole();
hStd = GetStdHandle(STD_INPUT_HANDLE);
hFile = (long)_open_osfhandle((intptr_t)hStd, _O_TEXT);
fp = _fdopen(hFile, "r");
(*stdin) = (*fp);
hStd = GetStdHandle(STD_OUTPUT_HANDLE);
hFile = (long)_open_osfhandle((intptr_t)hStd, _O_TEXT);
fp = _fdopen(hFile, "w"); // 注意:必须是可写模式
(*stdout) = (*fp);
hStd = GetStdHandle(STD_ERROR_HANDLE);
hFile = (long)_open_osfhandle((intptr_t)hStd, _O_TEXT);
fp = _fdopen(hFile, "w"); // 注意:必须是可写模式
(*stderr) = (*fp);
cout << "打开控制台成功" << endl;
return result;
}
4.在MainFrame的构造函数中添加
OpenConsole();
5.在要cout的类的头文件中加入如下代码:
#include<iostream>
using namespace std;
该方法能够在MFC控制台中输出代码片中cout和printf的信息!
后面因为需要在UI界面中进行输出,所以不得不另谋他路,使用的方法是直接从流中读取数据进行输出,这里说明一下,我的控件是多行文本,如果出现字符串闪动或者太长的话,可以参考这篇博客http://blog.csdn.net/jinhill/article/details/6180321
VC编辑框追加字符串并自动滚屏功能
在UI界面输出首先建立一个头文件
log.h
template <class Elem = char, class Tr = std::char_traits<Elem>> class StandardOutputRedirector : public std::basic_streambuf<Elem, Tr> { typedef void(*cb_func_ptr)(const Elem*, std::streamsize count, void* data); //typedef void(*cb_func_ptr)(const Elem*, std::streamsize count); public: StandardOutputRedirector(std::ostream& stream, cb_func_ptr cb_func, void* data) : stream_(stream), cb_func_(cb_func), data_(data) { buf_ = stream_.rdbuf(this); }; ~StandardOutputRedirector() { stream_.rdbuf(buf_); } std::streamsize xsputn(const Elem* ptr, std::streamsize count) { cb_func_(ptr, count, data_); return count; } typename Tr::int_type overflow(typename Tr::int_type v) { Elem ch = Tr::to_char_type(v); cb_func_(&ch, 1, data_); return Tr::not_eof(v); } private: std::basic_ostream<Elem, Tr>& stream_; std::streambuf* buf_; cb_func_ptr cb_func_; void* data_; }; StandardOutputRedirector<char, std::char_traits<char>>* cout_redirector_;
在XXX.H中添加:
public:
static void update(const char* text, std::streamsize count, void* log_widget_ptr);
void show(const char* text, std::streamsize count, void* log_widget_ptr);
private:
static Reconstruction * res
在XXX.CPP中添加:
需要在XXX类构造函数中添加
res = this;
cout_redirector_ = new StandardOutputRedirector<char, std::char_traits<char>>(std::cout, update, this);另外需要添加
XXX* XXX::res;
void XXX::update(const char* text, std::streamsize count, void* log_widget_ptr) {
res->show(text, count, log_widget_ptr);
}
void XXX::show(const char* text, std::streamsize count, void* log_widget_ptr) {
std::string text_str;
for (std::streamsize i = 0; i < count; ++i) {
if (text[i] == '\n') {
text_str += "\n";
}
else {
text_str += text[i];
}
}
CEdit *pEt = (CEdit *)GetDlgItem(LOG_EDIT);
int nLength = pEt->SendMessage(WM_GETTEXTLENGTH);
pEt->SetSel(nLength, nLength);
pEt->ReplaceSel(text_str.c_str());
pEt->LineScroll(pEt->GetLineCount());
}之所以会使用到两个函数和一个静态变量,是因为出现的静态函数调用非静态成员函数或变量带来的问题,如果要对文本框进行赋值显示,必须先声明及实例化一个对象才可以,因此为了避免这点带来的问题,特意先声明一个静态变量和非静态成员函数。
如上,就应该可以在LOG_EDIT文本框中得到COUT的输出了
相关文章推荐
- 如何使MFC编写的程序作为服务运行,并正常显示界面
- 用mingw编译C++工程;程序里面的cout<<"aaa";cmd运行c++程序,aaa内容在控制台不显示,如何将aaa输出到控制台屏幕并将控制台内容写到一个文件中。
- MFC(win32GUI)程序中显示Dos调试信息.console.显示控制台界面.标准输出.
- VS2013 MFC 调用控制台 用于显示cout输出流
- 如何在MFC中使用cout和printf,输出到控制台
- GUI程序如何使用控制台输出调试信息[zz][MFC调用win32窗口显示调试信息,使用AllocConsole 函数 ]
- VC/MFC如何添加启动界面
- 如何在ogre游戏界面添加自己的信息,比如显示某变量的值
- cout如何控制输出格式?
- 如何通过动态生成Html灵活实现DataGrid分类统计的界面显示功能
- 如何在ogre游戏界面添加自己的信息,比如显示某变量的值
- 如何将控制台命令输出的内容显示在CEdit中
- 如何将OpenCV中的IplImage显示在MFC的窗口中
- 表A中的记录随时变化,程序显示A数据的界面中如何自动也跟着刷新?
- 如何禁用窗口关闭按钮在一个 MFC 多文档界面 (MDI) 应用程序
- 如何让OpenCV的图片显示在MFC窗口上
- 请问:软件运行前的设置界面显示'第一次运行软件,正在设置...'等信息的东东叫什么?如何做出这种东东呢?
- 多用户登录时,如何在登录界面上显示administrator账户
- 如何做到既保持XP风格界面又能正常显示toobar中的图标
- VC 界面上如何显示中文