1.1 缘由
在日常的VC开发中,有充分的理由需要一个输出打印信息的地方,微软为我们提供了TRACE,或者ATLTRACE,但是这必须是在DEBUG下,并且需要IDE或者Windbg工具的配合使用.但实际上有一种更简单的方式,不仅仅在DEBUG下,而且在RELEASE下,都可以不依赖任何工具的为我们打印信息或者提供控制.
1.2 使用Console Window
可以让窗体应用中拥有ConsoleWindow吗?
答案是肯定的:
在需要显示或者启动ConsoleWindow的地方调用如下代码
AllocConsole();
freopen("CONOUT$","w",stdout); //关于CONOUT$参见GetStdHandle在MSDN中的参数注解,这里是将stdout重定向到命令行输出
在程序退出之前应当释放我们分配的控制台资源.代码如下:
FreeConsole();
在调用了分配控制台之后,在释放控制台之前,可以直接调用printf函数来打印到控制台,就像在控制台程序下打印消息一样简单方便.
另外,不一定需要在程序启动,或程序退出时候来进行分配和释放,你也可用通过比如按键响应事件来控制分配和释放.
1.3 使用Console Window做更多的事情
有时候我们可能还需要更多的特性,比如像在纯的Console程序中一样,可以根据输入来做一些不同的事情,我们这里是通过ReadConsole来实现从命令行中读取输入信息。
1.3.1 源码说明
1._Console.h文件,位于Fade\Console目录下
该文件用于封装打开,关闭Console窗口,以及提供读取命令行输入内容的接口和控制接口
2.Console.h文件,位于Fade\Console目录下
该文件用于封装_Console.h,其中封装了功能函数和导出接口
3.ConsoleCommand.h文件,位于Fade\Console目录下
该文件用于封装Console.h,并且提供命令控制方式
4.ConsolePrint.h文件,位于Fade\Console目录下
该文件属于用于定制文件,提供了打印过滤的功能,如果你需要其他方面的定制,可以参照该文件来编写代码.
上述代码中引用了SingleTon.h,位于Fade\SingleTon目录下.这是单实例类的一种实现方法,后面会讲到.
1.3.2 使用方法
参见如下代码
static DWORD WINAPI Proc(LPVOID){
CConsolePrint* pCP=CConsolePrint::GetInstance();
while(1){
pCP->PrintfFilter("cmd1","Print1\r\n");
Sleep(500);
pCP->PrintfFilter("cmd2","Print2\r\n");
Sleep(500);
pCP->PrintfFilter("cmd3","Print3\r\n");
Sleep(500);
}
return 0;
}
BOOL CAMFC_DlgApp::InitInstance()
{
CConsolePrint::InitInstance()->ShowConsole();
::CreateThread(NULL,0,Proc,NULL,0,NULL);
该段代码需要包含ConsolePrint.h文件
上述代码启动了一个线程,并且在线程中使用CConsolePrint的PrintfFilter进行打印.
1.3.4 使用结果
1.启动程序
2.输入命令 PrintFilter cmd2
3.按下回车
上述步骤就是基本的操作方式,通过使用PrintFilter命令来控制打印输出.
命令格式为PrintFilter+空格+参数.
如果参数为空,则不打印任何内容,如果参数为”*”则打印所有内容,如果参数为其他字符串,则将该字符串同PrintfFilter中传入的字符串进行匹配.
程序还提供了CTRL+C的暂停和继续功能.
1.4 小结
看完了上述内容,是不是觉得很炫酷?不仅很炫酷,而且还为程序的调试,错误的发现提供了相当的便利.而且还能提供除了打印之外的更多控制,当然这个就需要读者自己去写代码了,不过也很简单,你看明白了ConsolePrint.h,然后根据这个来写你自己的命令行控制代码是非常容易的!