Windows 下的 C/C++编程 Windows 下的 C/C++编程 ++编程 ++ 对于任何一种编程语言, 都会以一个最基本的程序入门, 就是大家都很熟悉的 Hello World。 那么,我们也从这里开始吧。 最简单的 Windows 程序 1)TC 中的 Hello World 相信对于下面的 Turbo C 程序大家都不会陌生,这就是最简单的 TC 经典入门程序: #include < stdio.h > main( ) {prinft(“ Hello World ! ”);} 这个程序将在 DOS 模式中输出“Hello World” 。 Hello 2)最简单的 Windows 下的 Hello World 其实,下面的程序并不是标准的 Windows 应用程序,它不产生传统意义上的窗口,而只是跳 出一个对话框。让我们详细的操作一下: 首先从开始菜单中选择 Microsoft Visual C++ 6.0(其他版本也行)(见图 1-1) ; 图 1-1 Microsoft Visual C++ 6.0 然后通过 File 菜单中的 new 选项新建一个工程。 Projects 选项中选择 Win32 Application; 在 然后指定工程名,这里是:Hello World;再指定存储路径,这里是 D:\DirectX8.0 游戏编程\; 最后点击 OK。 (见图 1-2) 图 1-2 Projects 选项 Win32 Application Windows 下的 C/C++编程 下面出现以下窗口,选择 An empty project;点击 OK。 (见图 1-3) 图 1-3 An empty project 这样,就创建了一个空的工程,工程名为 Hello World,存储路径为 D:\DirectX8.0 游戏编 程\下的 Hello World 文件夹。 下一步,在空的工程中加入 C 语言的源程序文件。在 Visual C++ 6.0 的 File 菜单中选择 new 选项;在弹出的 File 菜单中选择 C++ Source File;选中 Add to project 选框;选中加入到 那个工程中,这里是 Hello World,就是刚才创建的工程;填写文件,这里是 Hello World,下 面是工程的存放路径;最后,选择 OK。 (见图 1-4) 图 1-4 工程的存放路径 这样,就在刚才的空工程中加入了一个文件,可以在 Vc 的 FileView 框中看到它,右边是它 的编辑框,在那里编写源程序。 (见图 1-5) Windows 下的 C/C++编程 图 1-5Vc 的编辑框 那么,加入如下代码: #include int WINAPI WinMain ( { HINSTANCE hInstance ,HINSTANCE nCmdShow) hPrevInstance , LPSTR lpcmdLine ,int MessageBox ( NULL , TEXT("Hello World!") ; TEXT("My 1st Program") , MB_OK) ; return 0 ;} 然后, 选择执行, 或者直接按 F5 键。 就会得到如下的执行结果: 一个弹出的对话框 (见图 1-6) 。 图 1-6 Hello World 弹出框 3)程序分析 和 TC 程序比较,这个 Windows 程序基本相同。包含了头文件,有一个主函数,在主函 数中调用了一个系统函数,主函数返回一个整数值。每个语句以分号结束,复合语句用大括 号包含。下面对它进行详细的分析。 4)程序的参数 下面,对上面的程序的参数从上至下进行分析。 ◆ #include 程序包含了一个头文件 windows.h ,基本上所有的 Windows 程序都会包含这个文 件。它定义了 Windows 的基本数据类型、数据结构、系统函数等。 ◆ int WINAPI WinMain Windows 下的 C/C++编程 Tc 中的程序是以 main 函数为程序入口的,而 Windows 程序是以 WinMain 函数为入 口的,这个函数的定义如下: 函数原型 int WINAPI WinMain ( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpcmdLine , int nCmdShow); 第一个参数 hInstance 是当前实例句柄,为一个整数,用于标识窗口、程序等。 第二个参数 hPrevInstance 被置为 NULL。 第三个参数 lpcmdLine 是运行程序的命令行。 第四个参数 nCmdShow 用于指定程序窗口最初的显示模式,可以在初始是指定是正 常还是最大化等。 WinMain 函数返回一个整数。 WINAPI 用于指定调用约定, 具体在 WINDEH.H 中定义。 ◆ MessageBox MessageBox 是一个 Windows API 函数,用于弹出一个对话框,显示一些简短的信 息。定义如下: 函数原型 MessageBox ( HWND hWnd , LPCTSTR lpText , LPCTSTR lpCaption , UINT uType ) ; 第一个参数 hWnd 是一个窗口句柄,表明对话框所属的窗口。 第二个参数 lpText 是一个字符串,表明需要显示的信息。TEXT 是一个宏。 第三个参数 lpCaption 是一个字符串,表明对话框的标题。 第四个参数 uType 用于指定对话框中的按钮和图标。 (见表 1-1)各种按钮和图标 类型可以同时使用,用“ | ”连接,如“MB_OK | MB_ERROR” 。 类型 MB_OK MB_OKCANCEL MB_YESNO MB_INFORMATION MB_WARNING MB_ERROR 确定 按钮 图标 ------------- 确定和取消 是和否 ------------提示 警告 出错 Windows 下的 C/C++编程 表 1-1 按钮和图标 试试让系统弹出不同的对话框 Windows 应用程序 1)真正的 Hello World 上一节中,实现了 Windows 弹出一个对话框,显示了一个简短的信息“Hello World” 。 但是,这和平时看到的大多数 Windows 应用程序不太一样,没有窗口,没有最大化、最小化 按钮等。虽然如此,它还是相当重要的,特别在显示出错或提示信息时尤为简便。 下面,来看一看一个真正的 Windows 窗口程序。 同样,创建一个新的工程,这里是 Hello World Windows(见图 1-7) : 试一试 图 1-7Hello World Windows 工程 然后加入一个新的 C++源文件(其实可以看成是 C 源文件,只是换了后缀名) ,文件 名为 Win Hello World。 下面是程序的代码。 注意 要利用空格和回车,还要注意程序代码的缩进,这样才能保证 代码的可读性,同时也会方便修改: #include LRESULT CALLBACK WndProc int WINAPI WinMain (HWND , UINT , WPARAM , LPARAM ) ; ( HINSTANCE hInstance ,HINSTANCE hPrevInstance, Windows 下的 C/C++编程 LPSTR lpcmdLine { static TCHAR static TCHAR HWND hwnd ; MSG msg ; WNDCLASS wndclass ; CS_HREDRAW | = 0 ; = 0 ; CS_VREDRAW ; WndProc ; wndclass. style = wndclass. cbClsExtra wndclass. cbWndExtra szAppName[ ] = , int nCmdShow) TEXT( " HelloWorld " ) ; szClassName[] = TEXT( " HelloWorldClass " ); wndclass. lpfnWndProc = wndclass. hInstance = hInstance ; wndclass. hIcon = LoadIcon ( NULL , IDI_APPLICATION) ; wndclass. hCursor = LoadCursor ( NULL , IDC_ARROW) ; wndclass.hbrBackground wndclass. LpszMenuName if { MessageBox ( NULL , TEXT ( " This program requires Windows NT !") , szAppName , MB_ICONERROR ) ; return 0 ; } hwnd = CreateWindow ( szClassName TEXT("My Hello WS_OVERLAPPEDWINDOW , CW_USEDEFAULT , NULL ,NULL , hInstance , NULL ) ; ShowWindow (hwnd , nCmdShow ) ; UpdateWindow ( hwnd ) ; while ( GetMessage ( & msg , NULL , 0 , 0 ) ) { TranslateMessage ( &msg ) ; DispatchMessage ( &msg) ; CW_USEDEFAULT , CW_USEDEFAULT ,CW_USEDEFAULT , , to Windows Program") , World ( ! RegisterClass = = NULL ; szClassName; ( & wndclass ) ) ( HBRUSH ) GetStockObject ( WHITE_BRUSH ) ; wndclass. lpszClassName = Windows 下的 C/C++编程 } return } LRESULT CALLBACK WndProc ( HWND LPARAM { lParam ) HDC hdc ; PAINTSTRUCT ps ; RECT rect ; switch ( message ) { case WM_CREATE :MessageBox( NULL , " HelloWorld!" , MessageBeep ( MB_OK ) ; return 0 ; case WM_PAINT:hdc = BeginPaint ( hwnd , &ps ) ; GetClientRect ( hwnd , &rect ) ; DrawText ( hdc , TEXT ( "Hello , Windows !") , -1 , &rect , DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint ( hwnd , &ps ) ; return 0 ; case WM_DESTROY : PostQuitMessage ( 0 ) ; return } return } 运行这个程序,将得到如下结果: 首先弹出一个对话框,并且伴随一个很熟悉的“当”的一声(见图 1-8) : DefWindowProc ( hwnd , message , wParam , lParam ) ; 0 ; "Hello World " , MB_OK) ; hwnd , UINT message ,WPARAM wParam , msg. wParam ; Windows 下的 C/C++编程 图 1-8 Hello World 弹出框 点击确定以后,关闭这个对话框,打开了一个 Windows 窗口(见图 1-9) : 图 1-9 Windows 窗口 这个窗口大家因该很熟悉了吧。一个标准的 Windows 窗口,可以最大化、最小化、拖动等。 好,接下来仔细分析一下整个程序的代码。当然,没有必要去记住这些所有的代码,基本上也没 有人记得住,以后在使用的时候,可以直接复制过去,然后作相应的修改就行了。 2) Windows 类 在程序分析之前,先说明一些基本的新的东西。 ◆ 数据类型 在这里,出现了一些在 TC 中没有见过的数据类型。这些是 Windows 程序的一些常见 数据类型。 基本上, 它们的命名与相应的英文含义相同, 或是在前面加上表示类型的字母, 如 32 位的类型加上 L,不过部分因为 Windows 版本的变迁而失去了原来的意义,只是沿 用以前的名字。 详细的说明以后会慢慢熟悉, 下面列举了一些常用的前缀和表达的意义 (见 表 1-2) : 前缀 c by n x、y cx、cy w l p sz s dw char BYTE short int int WORD LONG pointer (指针) string ended with zero string DWORD (以 0 结尾的字符串) (表示 x 坐标和 y 坐标) (表示 x 方向长度,y 方向长度) (无符号字符) 表示的数据类型 Windows 下的 C/C++编程 fn b Function BOOL (int) 表 1-2 常用的前缀 ◆ 函数 这里, 除了 MessageBox 之外, 还有一些 Windows API 函数, 下面列表说明 (见表 1-3) : API 函数 LoadIcon LoadCursor GetStockObject RegisterClass CreateWindow ShowWindows UpdateWindow GetMessage TranslateMessage DispatchMessage MessageBeep BeginPaint GetClientRect DrawText EndPaint PostQuitMessage DefWindowProc 加载程序图标 加载鼠标 获取图形设备对象 注册窗口类 创建窗口 显示窗口 刷新窗口 从消息队列中获取消息 转换消息 发送消息 发出系统声音 开始在用户区绘制 取得用户区 显示文本 结束绘制 插入推出消息 执行缺省的消息处理 表 1-3 Windows API 函数 好,现在来看看 Windows 类。