在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开发环境的详细信息。