新建一个MFC窗口程序,双击界面上的OK键。
先介绍要用到的函数:
AllocConsole()函数会为主调进程分配一个新的控制台。
函数原型:
BOOL WINAPI AllocConsole(void);
参数: 无
返回值 :如果函数成功,返回值是非零值;如果函数失败,返回值是零值。
备注: 一个进程仅能关联一个控制台,所以该函数在主调进程已经具有控制台时将会失败。
FreeConsole()
调用AllocConsole()函数关联DOS窗口后需要用此函数释放关联的DOS窗口,如果直接按下窗口程序上的×键关闭程序会报错。所以可以把此函数写到“取消”按钮的回调函数里。
WriteConsole()
函数原型:
BOOLWINAPIWriteConsole(
__in HANDLEhConsoleOutput,
__in const VOID *lpBuffer,
__in DWORDnNumberOfCharsToWrite,
__out LPDWORDlpNumberOfCharsWritten,
__reserved LPVOIDlpReserved
);
参数:
hConsoleOutput
控制台屏幕缓冲区的句柄。该句柄必须具有的GENERIC_WRITE的访问权限。
lpBuffer
包含要写入控制台屏幕缓冲区字符的缓冲区的指针。
如果缓冲区的从进程的64kb堆里分配.缓冲区的最大大小将取决于堆的使用。
nNumberOfCharsToWrite
要写入的字符数。如果指定的字符数的总大小超过可用的堆,该函数会ERROR_NOT_ENOUGH_MEMORY失败。
lpNumberOfCharsWritten
指向一个变量的指针,该变量接收实际写入的字符数。
lpReserved
保留; 必须为NULL。
然后是获取字符串宽度的函数:
strlen()及wcslen()是标准C++定义的函数,它们分别获取ASCII字符串及宽字符串的长度。
新版本的VS一般默认工程都是Unicode宽字符集,所以一般用wcslen()函数算出字符串宽度。如果是纯英文字符串还可以用C提供的函数sizeof()来计算字符串宽度。
--------------------------------------------
1.首先调用AllocConsole();函数。
void CDOS_MDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//CDialogEx::OnOK();
CString terribly;
AllocConsole();//关联一个控制台
HANDLE hdlWrite = GetStdHandle(STD_OUTPUT_HANDLE); //取得控制台的句柄
terribly=L"春哥纯爷们!"; //准备输出的字符串
WriteConsole(hdlWrite, terribly, wcslen(terribly), NULL, NULL); //向DOS窗口里输出字符串
}
2.调用完之后需要释放DOS窗口,在取消键的回调函数中调用FreeConsole()函数释放资源
void CDOS_MDlg::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
FreeConsole();//释放关联的控制台,不然会报错
CDialogEx::OnCancel();
}
3.有时候操作的快了就容易点击右上角的×键关闭程序,造成程序出错,所以最好在重载一下OnSysCommand消息,在回调函数中加入释放控制台的命令
void ×××::OnSysCommand(UINT nID, LPARAM lParam)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
FreeConsole();//释放关联的控制台,不然会报错
CDialogEx::OnSysCommand(nID, lParam);
}
4.如果觉得控制台内显示的信息过多还可以清屏
void ×××::OnBnClickedButton1()
{
system("cls"); //清屏,把控制台内的信息全部清除
}
MFC调用DOS窗口输出信息算是一种调试程序的补充,因为有时候没办法用调试窗口查看输出信息。