65.9K
CodeProject 正在变化。 阅读更多。
Home

CConsole - 用于调试输出的简单控制台

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.76/5 (14投票s)

2002 年 8 月 20 日

4分钟阅读

viewsIcon

135680

downloadIcon

2380

以易于处理的方式显示调试信息到控制台。

Sample Image - debugcon.gif

引言

这是我在 CodeProject 上的第一篇文章。如果这篇文章写得不好,下次我可能会知道该怎么做得更好 ;-) 这不是一篇高级文章,但我希望它能对一些人有所帮助。如果您发现任何错误或知道如何改进我的编码风格,请告诉我!我还有很多东西需要学习,而最好的方法就是在 CodeProject.com 上学习。

概述

几天前,我正在寻找一种方法来在我的 Release 版本中提供简单的调试信息,以便下载我程序的​​用户也能查看调试输出,并在我的程序出现问题时将日志发送给我。有很多方法可以实现这一点。一种方法是创建一个非模态窗口,并在其中放置一个 listview 控件来写入调试信息。但我发现了一些非常有趣的 API 调用,它们与控制台有关。这就是为什么我为一些控制台函数(如 AllocConsoleWriteConsole 等)编写了自己的简单包装类。我的主要目标是尽可能保持包装类简单,以便任何人都能在自己的应用程序中轻松使用此类。

CConsole 类

CConsole 包装类目前包含 11 个函数

bool   Create(const char* szTitle, bool bNoClose = false);
void   Color(WORD wColor = NULL);
void   Output(const char* szOutput = NULL, ...);
void   SetTitle(const char* szTitle);
char*  GetTitle();
HWND   GetHWND();
HANDLE GetHandle();
void   ShowConsole(bool bShow = true);
void   DisableClose();
void   Clear();
void   Close();

我现在将详细解释它们

bool   Create(const char* szTitle = NULL, bool bNoClose = false);

此函数将创建控制台并将其显示在屏幕上。参数

  • const char* szTitle = NULL - 控制台窗口的标题,可以设置为 NULL
  • bool bNoClose = false - 如果设置为 true,控制台窗口的 [x] 按钮将被禁用,因此无法再关闭控制台,从而无法终止整个应用程序。您可以通过调用 DisableClose() 随时禁用 x 按钮。
  • 返回值: 成功则为 true,否则为 false
void   Color(WORD wColor = NULL);

此函数更改输出文本和控制台背景的颜色。参数

  • WORD wColor = NULL - 允许 FOREGROUND_RED, FOREGROUND_GREEN, FOREGROUND_BLUE, FOREGROUND_INTENSITYBACKGROUND_RED, BACKGROUND_GREEN, BACKGROUND_BLUE 的任意组合。有关更多信息,请参阅 MSDN 库中的 SetConsoleTextAttributes()
    如果留空,颜色将重置为默认值(黑色背景上的白色文本)。
void   Output(const char* szOutput = NULL, ...);

此函数将输出写入控制台。您可以输入一个简单的 string 甚至一个格式化的 string,就像从 printf() 中已知的那样。(例如,con.Output("This is some %s with number %i", string, 14) 将生成 This is some string with number 14。注意,如果您想另起一行,则必须在 string 的末尾加上换行符 \n。或者,您也可以调用 Output() 并将参数留空。这也会写入新的一行。

void   SetTitle(const char* szTitle);

您可以随时这样设置控制台标题:SetTitle("New Title");

char*  GetTitle();
HWND   GetHWND();
HANDLE GetHandle();

这些函数允许您检索控制台的一些属性,例如其标题、窗口句柄或控制台句柄。

void   Show(bool bShow = true);

如果您想显示/隐藏控制台,请调用此函数。将 bShow 设置为 true 以显示,设置为 false 以隐藏控制台。
注意:这并不会删除控制台。如果您想删除控制台,请调用 Close()

void   DisableClose();

这将禁用控制台的 [x] 按钮,因此您无法关闭它(从而关闭整个应用程序)。

void   Clear();

如果您想清除调试输出,请使用此函数。请注意,如果您调用此函数,将无法恢复之前的输出!

void   Close();

此函数将销毁控制台。所有输出都将消失,除非您使用 CConsole::Create() 设置新控制台,否则无法调用 CConsole 的任何其他函数。

如何使用它

在您的主应用程序中添加一个成员变量 CConsole m_Console 或类似的变量。
接下来,Create() 控制台。例如,这可以在 MFC 应用程序的 OnInitDialog() 处理程序或任何其他初始化代码中完成。

BOOL CConsoleDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	(...)

	// Create a console with title "Debug output window" and a disabled close button
	if(!m_Console.Create("Debug output window", true))
	    // insert code for the case the console could not be created

	return TRUE;
}

设置好控制台后,您就可以调用其他函数了。

// some button is pressed
void CConsoleDlg::OnButtonTest()
{
	// set the color of the output to an intense red font and blue background
	// this is really not advisable ;-)
	m_Console.Color(FOREGROUND_RED | FOREGROUND_INTENSITY | BACKGROUND_BLUE);

	// write some output to the console
	// without '\n' at the end of the string this will NOT write a new line
	m_Console.Output("Test string %s number %i",szSomeString, count");

	// insert new line
	m_Console.Output();

	// set color to default:
	m_Console.Color();

	// write output WITH new line
	m_Console.Output("Line2\n");

	// set title of console
	m_Console.SetTitle("New Title");

	// hide the console
	m_Console.ShowConsole(false);

	// and so on...
}

在您的应用程序即将终止时,请勿忘记使用 m_Console.Close() 关闭您的控制台。

关于代码

此类完全由我自己编写,除了用于清除控制台的代码。该代码取自 Microsoft Knowledge Base。您可以在 此处找到该文章。该类应同时在 MFC 和非 MFC 应用程序中运行。请随意随意使用此代码,对其进行修改,并根据您的需求进行扩展。但请不要删除源文件顶部的我的名字。

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.