1.2.2 C++取代C
在Brian Kernighan和Dennis Ritchie发布第一版C (1978年)仅几年后,也就是1983年,Bjarne Stroustrup创建了一种新的语言,在C语言的基础上添加了面向对象的概念。这种语言就是C++,它很快也在Windows平台中流行起来。
C++允许将数据和功能封装在类中,同时还支持对象继承和多态性。通过这些功能,Windows的平面API可以表示为一组较小的实体,将数据结构和API操作组合成一个逻辑上下文。例如,与在UI上创建、显示和管理窗口相关的所有操作都可以归入一个称为Window的类。
C++方法可帮助开发人员更好地了解API,同时降低了Windows编程入门的门槛。例如,程序清单1-1中描述的“Hello, World”程序的基本组成部分可以围绕对象进行组织,如程序清单1-2所示。
程序清单1-2:采用C++语言的“Hello, World”程序蓝图(节选)
- // --- 表示主程序的类
- class Main
- {
- public:
- static HINSTANCE hInstance;
- static HINSTANCE hPrevInstance;
- static int nCmdShow;
- static int MessageLoop( void );
- };
-
- // --- 表示窗口的类
- class Window
- {
- protected:
- HWND hWnd;
- public:
- HWND GetHandle( void ) { return hWnd; }
- BOOL Show( int nCmdShow ) { return ShowWindow( hWnd, nCmdShow ); }
- void Update( void ) { UpdateWindow( hWnd ); }
- virtual LRESULT WndProc( UINT iMessage, WPARAM wParam, LPARAM lParam ) = 0;
- };
-
- // --- 表示该程序的主窗口的类
- class MainWindow : public Window
- {
- // --- 为简便起见省略了实现过程
- }
-
- // --- 节选自Main类的实现
- int Main::MessageLoop( void )
- {
- MSG msg;
-
- while( GetMessage( (LPMSG) &msg, NULL, 0, 0 ) )
- {
- TranslateMessage( &msg );
- DispatchMessage( &msg );
- }
- return msg.wParam;
- }
-
- LRESULT MainWindow::WndProc( UINT iMessage, WPARAM wParam, LPARAM lParam )
- {
- switch (iMessage)
- {
- case WM_CREATE:
- break;
- case WM_PAINT:
- Paint();
- break;
- case WM_DESTROY:
- PostQuitMessage( 0 );
- break;
- default:
- return DefWindowProc( hWnd, iMessage, wParam, lParam );
- }
- return 0;
- }
通过C++提供的面向对象的方法,可以将对象行为打包到可重用的代码库中。程序员可以基于这些库创建程序,这样,他们只需定义与内置行为不同的那些行为。例如,他们需要重写程序清单1-2中的Paint()方法,以便重新绘制其窗口对象的UI。
采用了C++和对象库后,Windows编程发生了很大的变化。Microsoft创建了两个库,分别是Microsoft基础类(Microsoft Foundation Classes,MFC)和活动模板库(Active Template Library,ATL),在Microsoft的旗舰开发环境Visual Studio中仍维护并使用这两个库。
注意:接下来将介绍有关Visual Studio开发环境的详细信息。