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






4.76/5 (14投票s)
2002 年 8 月 20 日
4分钟阅读

135680

2380
以易于处理的方式显示调试信息到控制台。
引言
这是我在 CodeProject 上的第一篇文章。如果这篇文章写得不好,下次我可能会知道该怎么做得更好 ;-) 这不是一篇高级文章,但我希望它能对一些人有所帮助。如果您发现任何错误或知道如何改进我的编码风格,请告诉我!我还有很多东西需要学习,而最好的方法就是在 CodeProject.com 上学习。
概述
几天前,我正在寻找一种方法来在我的 Release 版本中提供简单的调试信息,以便下载我程序的用户也能查看调试输出,并在我的程序出现问题时将日志发送给我。有很多方法可以实现这一点。一种方法是创建一个非模态窗口,并在其中放置一个 listview 控件来写入调试信息。但我发现了一些非常有趣的 API 调用,它们与控制台有关。这就是为什么我为一些控制台函数(如 AllocConsole
、WriteConsole
等)编写了自己的简单包装类。我的主要目标是尽可能保持包装类简单,以便任何人都能在自己的应用程序中轻松使用此类。
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_INTENSITY
和BACKGROUND_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 应用程序中运行。请随意随意使用此代码,对其进行修改,并根据您的需求进行扩展。但请不要删除源文件顶部的我的名字。
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。