MFC程序和Win32程序的关系

MFC把具有相当固定行为的WinMain内部操作封装在CWinApp中,把有着相当固定行为的WndProc内部操作封装在CFrameWnd中。

几乎可以说CWinApp用来取代WinMain在SDK程序中的地位,CFrameWnd取代SDK程序中窗口函数的地位。

首先MFC程序需要下面函数库:

(1) Windows C Runtime函数库:LIBC.LIB / MSVCRT.LIB / MSVCRTD.LIB

(2) DLL Import函数库:GDI32.LIB / USER32.LIB / KERNEL32.LIB

(3) MFC函数库(AFX函数库):MFC42.LIB / MFC42D.LIB……

同时,MFC程序需要下面头文件:

(1) Stdafx.h:预编译头文件,其内只是载入其他的MFC头文件。

(2) Afxwin.h:每个MFC程序都必须载入它,因为它以及它所载入的文件声明了所有的MFC类,此文件含有Afx.h,后者又载入Afxvver_.h,后者又载入Afxv_w32.h,后者又载入windows.h(SDK程序必须要的头文件)。

(3) Afxext.h:使用工具栏、状态栏的程序必须载入这个文件。

(4) Afxdlgs.h:使用通用型对话框的MFC程序需要此文件,其内部载入COMMDLG.H

(5) Afxcmn.h:使用Win9x新增的通用型控件的MFC程序必须载入此文件。

(6) Afxcoll.h:使用Collections Classes的程序要此文件

(7) Afxres.h:MFC程序的RC文件必须载入此文件。

[解释]预编译头文件:所谓预编译头文件是指将 .H 文件第一次编译后的结果保存起来,第2次编译的时候就可以直接从磁盘上取出来用。

一个具体而微的MFC程序和Win32之间的关系:

MFC程序也是Windows程序,所以它应该有一个WinMain,但在程序进入点之前,还有一个全局对象theApp,这是所谓的应用程序对象。当操作系统将程序加载并激活的时候,这个全局对象获得配置,其构造函数会先执行,必WinMain更早。

CmyWinApp theApp;

theApp是程序的应用程序对象,每一个MFC程序有且只有这么一个,当执行程序时,这个全局对象产生,于是构造函数执行起来。一般来说CwinApp的构造函数被执行。CwinApp之中的成员变量将因为theApp这个全局对象的诞生而获得配置与初值。

theApp配置完成后,WinMain登场,我们并没有撰写WinMain程序代码,这是MFC早已准备好并由连接器直接加到应用程序代码中的。加入如下代码:

extern “C” int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)

{

return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);

}

其中AfxWinMain定义如下:

int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)

{

int nReturnCode = -1;

CwinApp *pApp = AfxGetApp();

AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow);

pApp->InitApplication();

pApp->InitInstance();

nReturnCode = pApp->Run();

AfxWinTerm();

Return nReturnCode;

}

关于AfxWinMain的四个主要操作说明:

(1) AfxWinInit——AFX内部初始化操作。它是继CwinApp构造函数之后的第一个操作。在这函数内对theApp的某些成员初始化,而且还调用了AfxInitThread函数,把消息队列尽量加大到96。

(2) CwinApp::InitApplication。InitApplication是CwinApp的一个虚函数,一般情况下不需要改写它。在此函数中的操作都是MFC为了内部管理而作的(DocManager相关)。

(3) CmyWinApp::InitInstance。每个MFC程序都应该改写CwinApp::InitInstance这个函数,因为它在CwinApp中只是一个空函数。在这个函数里面,代码如下:

BOOL CmyWinApp::InitInstance()

{

m_pMainWnd = new CmyFrameWnd();

m_pMainWnd->ShowWindow(m_nCmdShow);

m_pMainWnd->UpdateWindow();

return TRUE;

}

其中一开始就new了一个CmyFrameWnd对象,准备用作主框窗口的C++对象,引发了CmyFrameWnd的构造函数:

CmyFrameWnd::CmyFrameWnd

{

Create(NULL,”hello MFC”, WS_OVERLAPPEDWINDOW, rectDefault, NULL,”MainMenu”);

}

Create是CframeWnd的成员函数,CmyFrameWnd中并没有改写它。由于Create的第一个参数指定WNDCLASS窗口类名字,现在为NULL表示以MFC内建的窗口类产生一个标准的外框窗口。

在CframeWnd::Create(…)函数中,调用了CreateEx函数,由于CframeWnd中并没有改写CreateEx函数,所以实际上调用的是CWnd::CreateEx。在CreateEx这个函数中,调用了PreCreateWindow和CreateWindowEx这两个函数。由于CframeWnd中改写了PreCreateWindow,所以这里调用的是CframeWnd::PreCreateWindow。在 PreCreateWindow里面,调用了AfxDeferRegisterClass宏,该宏的定义如下:

#define AfxDeferRegisterClass(fClass) / ((afxRegisteredClasses & fClass) TRUE : AfxEndDeferRegisterClass(fclass))

如果变量afxRegisteredClasses的值显示系统已经注册了fclass这种窗口类,MFC就啥也不做,否则就调用 AfxEndDeferRegisterClass(fclass),准备注册之。AfxEndDeferRegisterClass函数中终于声明了 WNDCLASS对象,并且调用了相应的MFC窗口类,并通过AfxRegisterClass(WNDCLASS*)和 RegisterWithIcon这两个函数来注册窗口类。MFC内置6种窗口类。RegisterWithIcon中用到 AfxRegisterClass函数,而AfxRegisterClass函数里面又调用了RegisterClass函数来注册窗口类。不同类的 PreCreateWindow成员函数都是在窗口产生之前一刻被调用,准备用来注册窗口类的,如果我们指定窗口类为NULL,那么就是用系统默认类 (MFC内置)。

当创建完窗口以后,程序流程又回到CmyWinApp::InitInstance,于是调用ShowWindow函数令窗口显示出来,并调用UpdateWindow函数令程序送出WM_PAINT消息。

(4) CwinApp::Run,由于在CmyWinApp中没有改写Run(大部分情况下都不用改写),所以调用的是CwinApp::Run。在该函数中又调用了CwinThread::Run,CwinThread::Run中调用了PumpMesage()函数,而PumpMessage函数中依次调用 GetMessage / TranslateMessag / DispatchMessage函数。程序通过调用DispatchMessage函数,把消息丢给窗口函数。

(5) 程序根据消息映射表来判断消息,从而做出相应的消息处理。

至此,MFC程序和Win32程序的关系总算弄明白。

MFC把具有相当固定行为的WinMain内部操作封装在CWinApp中,把有着相当固定行为的WndProc内部操作封装在CFrameWnd中。

几乎可以说CWinApp用来取代WinMain在SDK程序中的地位,CFrameWnd取代SDK程序中窗口函数的地位。

首先MFC程序需要下面函数库:

(1) Windows C Runtime函数库:LIBC.LIB / MSVCRT.LIB / MSVCRTD.LIB

(2) DLL Import函数库:GDI32.LIB / USER32.LIB / KERNEL32.LIB

(3) MFC函数库(AFX函数库):MFC42.LIB / MFC42D.LIB……

同时,MFC程序需要下面头文件:

(1) Stdafx.h:预编译头文件,其内只是载入其他的MFC头文件。

(2) Afxwin.h:每个MFC程序都必须载入它,因为它以及它所载入的文件声明了所有的MFC类,此文件含有Afx.h,后者又载入Afxvver_.h,后者又载入Afxv_w32.h,后者又载入windows.h(SDK程序必须要的头文件)。

(3) Afxext.h:使用工具栏、状态栏的程序必须载入这个文件。

(4) Afxdlgs.h:使用通用型对话框的MFC程序需要此文件,其内部载入COMMDLG.H

(5) Afxcmn.h:使用Win9x新增的通用型控件的MFC程序必须载入此文件。

(6) Afxcoll.h:使用Collections Classes的程序要此文件

(7) Afxres.h:MFC程序的RC文件必须载入此文件。

[解释]预编译头文件:所谓预编译头文件是指将 .H 文件第一次编译后的结果保存起来,第2次编译的时候就可以直接从磁盘上取出来用。

一个具体而微的MFC程序和Win32之间的关系:

MFC程序也是Windows程序,所以它应该有一个WinMain,但在程序进入点之前,还有一个全局对象theApp,这是所谓的应用程序对象。当操作系统将程序加载并激活的时候,这个全局对象获得配置,其构造函数会先执行,必WinMain更早。

CmyWinApp theApp;

theApp是程序的应用程序对象,每一个MFC程序有且只有这么一个,当执行程序时,这个全局对象产生,于是构造函数执行起来。一般来说CwinApp的构造函数被执行。CwinApp之中的成员变量将因为theApp这个全局对象的诞生而获得配置与初值。

theApp配置完成后,WinMain登场,我们并没有撰写WinMain程序代码,这是MFC早已准备好并由连接器直接加到应用程序代码中的。加入如下代码:

extern “C” int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)

{

return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);

}

其中AfxWinMain定义如下:

int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)

{

int nReturnCode = -1;

CwinApp *pApp = AfxGetApp();

AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow);

pApp->InitApplication();

pApp->InitInstance();

nReturnCode = pApp->Run();

AfxWinTerm();

Return nReturnCode;

}

关于AfxWinMain的四个主要操作说明:

(1) AfxWinInit——AFX内部初始化操作。它是继CwinApp构造函数之后的第一个操作。在这函数内对theApp的某些成员初始化,而且还调用了AfxInitThread函数,把消息队列尽量加大到96。

(2) CwinApp::InitApplication。InitApplication是CwinApp的一个虚函数,一般情况下不需要改写它。在此函数中的操作都是MFC为了内部管理而作的(DocManager相关)。

(3) CmyWinApp::InitInstance。每个MFC程序都应该改写CwinApp::InitInstance这个函数,因为它在CwinApp中只是一个空函数。在这个函数里面,代码如下:

BOOL CmyWinApp::InitInstance()

{

m_pMainWnd = new CmyFrameWnd();

m_pMainWnd->ShowWindow(m_nCmdShow);

m_pMainWnd->UpdateWindow();

return TRUE;

}

其中一开始就new了一个CmyFrameWnd对象,准备用作主框窗口的C++对象,引发了CmyFrameWnd的构造函数:

CmyFrameWnd::CmyFrameWnd

{

Create(NULL,”hello MFC”, WS_OVERLAPPEDWINDOW, rectDefault, NULL,”MainMenu”);

}

Create是CframeWnd的成员函数,CmyFrameWnd中并没有改写它。由于Create的第一个参数指定WNDCLASS窗口类名字,现在为NULL表示以MFC内建的窗口类产生一个标准的外框窗口。

在CframeWnd::Create(…)函数中,调用了CreateEx函数,由于CframeWnd中并没有改写CreateEx函数,所以实际上调用的是CWnd::CreateEx。在CreateEx这个函数中,调用了PreCreateWindow和CreateWindowEx这两个函数。由于CframeWnd中改写了PreCreateWindow,所以这里调用的是CframeWnd::PreCreateWindow。在 PreCreateWindow里面,调用了AfxDeferRegisterClass宏,该宏的定义如下:

#define AfxDeferRegisterClass(fClass) / ((afxRegisteredClasses & fClass) TRUE : AfxEndDeferRegisterClass(fclass))

如果变量afxRegisteredClasses的值显示系统已经注册了fclass这种窗口类,MFC就啥也不做,否则就调用 AfxEndDeferRegisterClass(fclass),准备注册之。AfxEndDeferRegisterClass函数中终于声明了 WNDCLASS对象,并且调用了相应的MFC窗口类,并通过AfxRegisterClass(WNDCLASS*)和 RegisterWithIcon这两个函数来注册窗口类。MFC内置6种窗口类。RegisterWithIcon中用到 AfxRegisterClass函数,而AfxRegisterClass函数里面又调用了RegisterClass函数来注册窗口类。不同类的 PreCreateWindow成员函数都是在窗口产生之前一刻被调用,准备用来注册窗口类的,如果我们指定窗口类为NULL,那么就是用系统默认类 (MFC内置)。

当创建完窗口以后,程序流程又回到CmyWinApp::InitInstance,于是调用ShowWindow函数令窗口显示出来,并调用UpdateWindow函数令程序送出WM_PAINT消息。

(4) CwinApp::Run,由于在CmyWinApp中没有改写Run(大部分情况下都不用改写),所以调用的是CwinApp::Run。在该函数中又调用了CwinThread::Run,CwinThread::Run中调用了PumpMesage()函数,而PumpMessage函数中依次调用 GetMessage / TranslateMessag / DispatchMessage函数。程序通过调用DispatchMessage函数,把消息丢给窗口函数。

(5) 程序根据消息映射表来判断消息,从而做出相应的消息处理。

至此,MFC程序和Win32程序的关系总算弄明白。

MFC把具有相当固定行为的WinMain内部操作封装在CWinApp中,把有着相当固定行为的WndProc内部操作封装在CFrameWnd中。

几乎可以说CWinApp用来取代WinMain在SDK程序中的地位,CFrameWnd取代SDK程序中窗口函数的地位。

首先MFC程序需要下面函数库:

(1) Windows C Runtime函数库:LIBC.LIB / MSVCRT.LIB / MSVCRTD.LIB

(2) DLL Import函数库:GDI32.LIB / USER32.LIB / KERNEL32.LIB

(3) MFC函数库(AFX函数库):MFC42.LIB / MFC42D.LIB……

同时,MFC程序需要下面头文件:

(1) Stdafx.h:预编译头文件,其内只是载入其他的MFC头文件。

(2) Afxwin.h:每个MFC程序都必须载入它,因为它以及它所载入的文件声明了所有的MFC类,此文件含有Afx.h,后者又载入Afxvver_.h,后者又载入Afxv_w32.h,后者又载入windows.h(SDK程序必须要的头文件)。

(3) Afxext.h:使用工具栏、状态栏的程序必须载入这个文件。

(4) Afxdlgs.h:使用通用型对话框的MFC程序需要此文件,其内部载入COMMDLG.H

(5) Afxcmn.h:使用Win9x新增的通用型控件的MFC程序必须载入此文件。

(6) Afxcoll.h:使用Collections Classes的程序要此文件

(7) Afxres.h:MFC程序的RC文件必须载入此文件。

[解释]预编译头文件:所谓预编译头文件是指将 .H 文件第一次编译后的结果保存起来,第2次编译的时候就可以直接从磁盘上取出来用。

一个具体而微的MFC程序和Win32之间的关系:

MFC程序也是Windows程序,所以它应该有一个WinMain,但在程序进入点之前,还有一个全局对象theApp,这是所谓的应用程序对象。当操作系统将程序加载并激活的时候,这个全局对象获得配置,其构造函数会先执行,必WinMain更早。

CmyWinApp theApp;

theApp是程序的应用程序对象,每一个MFC程序有且只有这么一个,当执行程序时,这个全局对象产生,于是构造函数执行起来。一般来说CwinApp的构造函数被执行。CwinApp之中的成员变量将因为theApp这个全局对象的诞生而获得配置与初值。

theApp配置完成后,WinMain登场,我们并没有撰写WinMain程序代码,这是MFC早已准备好并由连接器直接加到应用程序代码中的。加入如下代码:

extern “C” int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)

{

return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);

}

其中AfxWinMain定义如下:

int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)

{

int nReturnCode = -1;

CwinApp *pApp = AfxGetApp();

AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow);

pApp->InitApplication();

pApp->InitInstance();

nReturnCode = pApp->Run();

AfxWinTerm();

Return nReturnCode;

}

关于AfxWinMain的四个主要操作说明:

(1) AfxWinInit——AFX内部初始化操作。它是继CwinApp构造函数之后的第一个操作。在这函数内对theApp的某些成员初始化,而且还调用了AfxInitThread函数,把消息队列尽量加大到96。

(2) CwinApp::InitApplication。InitApplication是CwinApp的一个虚函数,一般情况下不需要改写它。在此函数中的操作都是MFC为了内部管理而作的(DocManager相关)。

(3) CmyWinApp::InitInstance。每个MFC程序都应该改写CwinApp::InitInstance这个函数,因为它在CwinApp中只是一个空函数。在这个函数里面,代码如下:

BOOL CmyWinApp::InitInstance()

{

m_pMainWnd = new CmyFrameWnd();

m_pMainWnd->ShowWindow(m_nCmdShow);

m_pMainWnd->UpdateWindow();

return TRUE;

}

其中一开始就new了一个CmyFrameWnd对象,准备用作主框窗口的C++对象,引发了CmyFrameWnd的构造函数:

CmyFrameWnd::CmyFrameWnd

{

Create(NULL,”hello MFC”, WS_OVERLAPPEDWINDOW, rectDefault, NULL,”MainMenu”);

}

Create是CframeWnd的成员函数,CmyFrameWnd中并没有改写它。由于Create的第一个参数指定WNDCLASS窗口类名字,现在为NULL表示以MFC内建的窗口类产生一个标准的外框窗口。

在CframeWnd::Create(…)函数中,调用了CreateEx函数,由于CframeWnd中并没有改写CreateEx函数,所以实际上调用的是CWnd::CreateEx。在CreateEx这个函数中,调用了PreCreateWindow和CreateWindowEx这两个函数。由于CframeWnd中改写了PreCreateWindow,所以这里调用的是CframeWnd::PreCreateWindow。在 PreCreateWindow里面,调用了AfxDeferRegisterClass宏,该宏的定义如下:

#define AfxDeferRegisterClass(fClass) / ((afxRegisteredClasses & fClass) TRUE : AfxEndDeferRegisterClass(fclass))

如果变量afxRegisteredClasses的值显示系统已经注册了fclass这种窗口类,MFC就啥也不做,否则就调用 AfxEndDeferRegisterClass(fclass),准备注册之。AfxEndDeferRegisterClass函数中终于声明了 WNDCLASS对象,并且调用了相应的MFC窗口类,并通过AfxRegisterClass(WNDCLASS*)和 RegisterWithIcon这两个函数来注册窗口类。MFC内置6种窗口类。RegisterWithIcon中用到 AfxRegisterClass函数,而AfxRegisterClass函数里面又调用了RegisterClass函数来注册窗口类。不同类的 PreCreateWindow成员函数都是在窗口产生之前一刻被调用,准备用来注册窗口类的,如果我们指定窗口类为NULL,那么就是用系统默认类 (MFC内置)。

当创建完窗口以后,程序流程又回到CmyWinApp::InitInstance,于是调用ShowWindow函数令窗口显示出来,并调用UpdateWindow函数令程序送出WM_PAINT消息。

(4) CwinApp::Run,由于在CmyWinApp中没有改写Run(大部分情况下都不用改写),所以调用的是CwinApp::Run。在该函数中又调用了CwinThread::Run,CwinThread::Run中调用了PumpMesage()函数,而PumpMessage函数中依次调用 GetMessage / TranslateMessag / DispatchMessage函数。程序通过调用DispatchMessage函数,把消息丢给窗口函数。

(5) 程序根据消息映射表来判断消息,从而做出相应的消息处理。

至此,MFC程序和Win32程序的关系总算弄明白。

 

 

 

评:经过近几天的努力,在同学的帮助下,又看了这两篇文章后,才了解WIN32编程和MFC之间的关系。

MFC调用win32窗口显示调试信息,使用AllocConsole 函数(2010-11-16 15:33:25)转载标签: 调试win32mfc杂谈 分类: 编译器 AllocConsole Function 为主调进程分配一个新的控制台。 语法 C++ : BOOL WINAPI AllocConsole(void); 参数: 无 返回值:如果函数成功,返回值是非零值;如果函数失败,返回值是零值。 备注: 一个进程仅能关联一个控制台,所以该函数在主调进程已经具有控制台时将会失败。 一个进程可以使用 FreeConsole 函数来释放与之关联的控制台,之后它就可以调用该函数来创建一个新的控制台或使用 AttachConsole 函数来关联另一个控制台。 如果主调进程创建了一个子进程,则子进程也将继承这个新创建的控制台。 该函数为新的控制台初始化标准输入、输出、错误句柄等。 标准输入句柄是一个控制台输入缓冲的句柄,标准输出和标准错误句柄则是控制台屏幕缓冲的句柄。为了获得这些句柄,可以使用 GetStdHandle 函数。 该函数主要用于GUI应用程序来创建一个控制台窗口。 GUI应用程序初始化时时没有控制台的,而控制台应用程序则以控制台来初始化的。 要求 : Minimum supported client Windows 2000 Professional Minimum supported server Windows 2000 Server Header: Wincon.h (include Windows.h) Library: Kernel32.lib DLL Kernel32.dll ---------------------------------------------------------------------------------------- 虽然WIN32时代是图形界面时代,但偶尔程序中还需要用到命令行模式,比如批处理,这时再搞个图形界面出来显得似乎就不那么专业了。但客户还需要在正常状态下(对于命令行模式,我认为用户是非正常状态,比如脑子进水。)使用图形界面,这决定我们不能开一个控制台工程,而需要使用MFC exe程序。 OK,理所当然的,通过条件控制,命令行下我关掉对话框界面的调用代码,再使用 cout << "Hello world!" << endl; 来向这个友好的世界打个招呼,并坚持认为这句问候应该显示在CMD那个漆黑的窗口里。 很沮丧地说,事实给我与痛击。cmd窗口里仍然漆黑一片,系统完全不理会我的友好。 邓爷爷说,改革开放好!也许,我也需要个改革。 在同事mr. zhang的指导下,我找到一组API:Console Functions!正是这组API,最终让我的友好得以正当地表达。 一。创建一个Console,AllocConsole 直接使用 AllocConsole(); 马上,若是进程内第一次调用这个函数,一个空的cmd窗口会蹦出来。需要注意,一个进程只能创建一个console,多次调用会返回FALSE;而且,这个窗口是个独立的控制台窗口。 MSDN的解释:A process can be associated with only one console, so the AllocConsole function fails if the calling process already has a console. 还有段:If the calling process creates a child process, the child inherits the new console. 二。显示Hello World,WriteConsole 有了console,我们还需要获取它的句柄HANDLE,然后才能在上面显示。方法是 GetStdHandle,它会获取前面我们AllocConsole得到的cmd窗口的句柄;若未调用AllocConsole,将获取标准的输入输出窗口句柄。 MSDN的解释:The GetStdHandle function returns a handle for the standard input, standard output, or standard error device. HANDLE hdlWrite = GetStdHandle(STD_OUTPUT_HANDLE); //这里也可以使用STD_ERROR_HANDLE TCHAR c[] = {"Hello world!"}; WriteConsole(hdlWrite, c, sizeof(c), NULL, NULL); 得到Console的句柄后直接使用 WriteConsole 函数即可在屏幕上显示啦。这个函数有5个参数:第一个是console的句柄,第二个是写出内容的地址,第三个参数是预计写出长度,第四个参数是实际写出长度,可为NULL,但不建议,若使用NULL,boundchecker会在这提示错误用法,第五参数系统保留,必须使用NULL。 MSDN里说也可以使用WriteFile来向console的handle输出。 三。获取用户输入, ReadConsole 光显示是不够的,用户还需要操作啊,当然,是键盘输入。 前面我们已经创建了一个Console,输入也需要使用这个console,但若还用上面的OUTPUT句柄就不行了,我们会发现,程序在下面这句会直接跳过。 ReadConsole(hdlWrite, c, 2, NULL, NULL); 这里,我们还需要一个STD_INPUT_HANDLE;如下: TCHAR Buffer[100]; //开缓存 memset(Buffer, 0, 100); DWORD dwCount = 0;//已输入数 HANDLE hdlRead = GetStdHandle(STD_INPUT_HANDLE); ReadConsole(hdlRead, Buffer, 100, &dwCount;, NULL); 这个函数和WriteConsole类似,但需要注意的是,第四个参数必须指定,否则会无法读取。 MSDN里还提到,若需要获取其它键盘外的输入信息,如鼠标信息,只能使用ReadConsoleInput函数: If the input buffer contains input events other than keyboard events (such as mouse events or window-resizing events), they are discarded. Those events can only be read by using the ReadConsoleInput function. 四。关闭Console 最后用完记得使用CloseHandle释放句柄,如: CloseHandle(hdlRead); CloseHandle(hdlWrite); 若想关闭Console,可以使用FreeConsole(); 需要注意的是,若用户直接点击cmd窗口的关闭按钮,整个程序(Application)将退出! 五。其他函数 这组函数还提供了其他有趣的功能,比如修改console的背景色,前景色等。更多函数请参见MSDN。 AllocConsole(); SetConsoleTitle("Lonefox love China"); //修改Console的标题 HANDLE hConsole = CreateConsoleScreenBuffer( GENERIC_READ | GENERIC_WRITE, //权限 FILE_SHARE_READ | FILE_SHARE_WRITE, //console的共享方式 NULL,//安全性设置,NULL默认即可 CONSOLE_TEXTMODE_BUFFER,//唯一值 NULL//保留 );//创建console的屏幕内容缓存,一个进程可以有多个ScreenBuffer SetConsoleActiveScreenBuffer(hConsole); //显示该buffer的内容 SetConsoleTextAttribute(hConsole, FOREGROUND_RED | BACKGROUND_GREEN); TCHAR c[] = {"Hello world!\n"}; WriteConsole(hConsole, c, sizeof(c), NULL, NULL); //在屏幕显示 CloseHandle(hConsole); FreeConsole(); 后记:本文仅学习笔记,非教科书。若有问题欢迎留言讨论!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值