2025-10-21 18:40:39 赛季特刊

MFC调试及运行状态下打印输出信息

使用C++进行MFC程序调试时,有时我们需要查看某个变量的实时值,或者需要查看程序此时的运行状态。那么就需要输出某些调试信息,方便跟踪变量及了解程序的与运行状态。但是直接使用printf是无法输出信息的,下面介绍一下这两种下如何输出调试信息。

1.MFC调试(F5)状态下输出调试信息:

直接使用TRACE()

例如:

设置断点,直接按下[F5],单步运行,同时观察调试窗口的输出(可以先把窗口清空以便观察),输出结果如图:

这就是在Debug调试模式下的输出,

注意:TRACE在直接运行下无法输出,只有调试模式下才可以输出。

2.MFC运行状态(Ctrl+F5)下打印输出信息:

使用printf()输出,但有个前提:需要在输出信息前写上两个语句:

AllocConsole();

// 为当前的窗口程序申请一个Console窗口 返回非零值:调用成功,返 回0,不成功

freopen(“CONOUT$”, “w”, stdout);

// 重新分配文件指针,以实现重定向。可重定向的流有:标准输入流、标准输出流或者标准错误流。

其中"CONOUT$"是指代当前console的特殊字符串,"w"表明以written模式打开这个console,stdout指代标准输出流。

运行后就会打开一个cmd窗口,然后就可以正常使用printf()输出信息

可以在初始化函数OnInitDialog()处调用一次,然后在需要输出的地方直接输出即可。

以下是一个完整的例子:

各个按钮的函数:

//显示调试信息:重定向

void CCPrintDlg::OnBtnshowprint()

{

PrintMessage();

}

//开始状态按钮

void CCPrintDlg::OnBtnstart()

{

printf("Start\n");

}

//结束状态按钮

void CCPrintDlg::OnBtnstop()

{

printf("Stop\n");

}

//辅组:清除屏幕按钮

void CCPrintDlg::OnBtnclear()

{

system("cls");

}

//设定窗口位置:宽高

void CCPrintDlg::OnSetSize()

{

//AllocConsole函数不能改变控制台窗口在屏幕上的位置、尺寸等属性。

//可以用SetConsoleWindowInfo来改变控制台窗口大小

using namespace std;

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);

SMALL_RECT rc;

rc.Left = 5;

rc.Top = 5;

rc.Right = 54;

rc.Bottom = 24;

SetConsoleWindowInfo(hOut, TRUE, &rc);//此时窗口的宽度为50,高度为20

}

//显示调试信息具体实现:重定向

void CCPrintDlg::PrintMessage()

{

AllocConsole(); //AllocConsole函数的功能是为当前的窗口程序申请一个Console窗口 返回非零值:调用成功,返回0,调用不成功

freopen("CONOUT$", "w", stdout); // freopen函数用来替换一个流,或者说重新分配文件指针,以实现重定向。可重定向的流有:标准输入流、标准输出流或者标准错误流。

//FILE *freopen(const char *path, const char *mode, FILE *stream);

//其中"CONOUT$"是指代当前console的特殊字符串,"w"表明以written模式打开这个console,stdout指代标准输出流。

std::cout << "调试输出窗口已打开" << std::endl;

}

运行结果:

说明:1.能够输出信息的前提就是先按下第一个按钮:显示调试信息,重定向后才能输出,否则printf()无效无法输出。

2.在初始化函数OnInitDialog()处调用一次PrintMessage(),然后在需要输出的地方直接输出即可。程序运行后直接调出Console窗口。

结语:谢谢!

dnf艾肯套多久一件dnf艾肯做一套要多久
2002世界杯总决赛经典回放尽享足球盛宴与精彩瞬间回顾
top