1、第 3章 MFC基本应用程序的建立3.1 Windows编程基础编制一个功能强大和易操作的 Windows应用程序所需要的代码肯定会比一般的 C+程序要多得多,但并不是所有的代码都需要自己从头开始编写,因为 Visual C+不仅提供了常用的Windows应用程序的基本框架,而且可以 在框架程序中直接调用 Win32 API(Application Programming Interface, 应用程序接口 )函数。 这样,用户仅需要在相应的框架位置中添加自己的代码或修改部分代码就可实现 Windows应用程序的许多功能。3.1.1 简单的 Windows应用程序先来看一个最简单的 Windo
2、ws应用程序 Ex_HelloMsg。例 Ex_HelloMsg 一个简单的 Windows应用程序#include int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)MessageBox (NULL, “你好,我的 Visual C+世界! “, “问候 “, 0) ;return 0 ;在 Visual C+ 6.0运行上述程序需要进行以下步骤:(1) 选择 “文件 ”“ 新建 ”菜单命令,显示出 “新建 ”对话框。在“工程 ”标签页面的列表框中,选中
3、 Win32 Application项。(2) 在工程编辑框中键入 Win32应用程序项目名称Ex_HelloMsg。在 “位置 ”编辑框中直接键入文件夹名称,或单击浏览按钮选择一个已有的文件夹。(3) 单击 确定 按钮继续。一个询问项目类型的Win32应用程序向导将被显示,选中 An empty project项。单击 完成 按钮,系统将显示该应用程序向导的创建信息,单击 确定 按钮系统将自动创建此应用程序。(4) 再次选择 “文件 ”“ 新建 ”菜单命令,显示出 “新建 ”对话框。在 “文件 ”标签页面左边的列表框中选择C+ Source File项,在右边的文件框中键入Ex_HelloM
4、sg.cpp,单击 确定 按钮。3.1.1 简单的 Windows应用程序例 Ex_HelloMsg 一个简单的 Windows应用程序(5) 输入上面的代码,运行程序,结果如图 3.1所示。从上面的程序可以看出: C+控制台应用程序以 main函数作为进入程序的初始入口点,但在 Windows应用程序中, main主函数被WinMain函数取代。 WinMain函数的原型如下:int WINAPI WinMain (HINSTANCE hInstance, / 当前实例句柄HINSTANCE hPrevInstance, / 前一实例句柄LPSTR lpCmdLine, / 指向命令行参数的
5、指针int nCmdShow) / 窗口的显示状态3.1.1 简单的 Windows应用程序所谓 句柄是一个标识 Windows资源 (如菜单、图标、窗口等 )和设备等对象的数据指针类型。通常,一个句柄变量可用来对系统中某些资源的间接引用。每一个 C+ Windows应用程序都需要 Windows.h头文件,它还包含了其他的一些 Windows头文件。这些头文件定义了 Windows的所有数据类型、函数调用、数据结构和符号常量。程序中, MessageBox是一个 Win32 API函数,用来弹出一个消息对话框。 该函数第一个参数用来指定父窗口句柄,即对话框所在的窗口句柄。第二、三个参数分别用
6、来指定显示的消息内容和对话框窗口的标题,最后一个参数用来指定在对话框中显示的按钮。3.1.1 简单的 Windows应用程序例 Ex_HelloWin 一个完整的 Windows应用程序#include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); / 窗口过程int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)HWND hwnd ; / 窗口句柄MSG msg ; / 消息WNDCLASS w
7、ndclass ; / 窗口类wndclass.style = CS_HREDRAW | CS_VREDRAW ;wndclass.lpfnWndProc = WndProc ;wndclass.cbClsExtra = 0 ;wndclass.cbWndExtra = 0 ;wndclass.hInstance = hInstance ;wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;wndclass.hbrBackground = (HBR
8、USH) GetStockObject (WHITE_BRUSH) ;wndclass.lpszMenuName = NULL ;wndclass.lpszClassName = “HelloWin“; / 窗口类名if (!RegisterClass ( return 0 ;hwnd = CreateWindow (“HelloWin“, / 窗口类名“我的窗口 “, / 窗口标题WS_OVERLAPPEDWINDOW, / 窗口样式CW_USEDEFAULT, / 窗口最初的 x 位置CW_USEDEFAULT, / 窗口最初的 y 位置CW_USEDEFAULT, / 窗口最初的 x 大
9、小CW_USEDEFAULT, / 窗口最初的 y 大小NULL, / 父窗口句柄NULL, / 窗口菜单句柄hInstance, / 应用程序实例句柄NULL) ; / 创建窗口的参数ShowWindow (hwnd, nCmdShow) ; / 显示窗口 UpdateWindow (hwnd) ; / 更新窗口,包括窗口的客户区/ 进入消息循环:当从应用程序消息队列中检取的消息是 WM_QUIT时,则退出循环。while (GetMessage ( / 转换某些键盘消息DispatchMessage ( / 将消息发送给窗口过程,这里是 WndProcreturn msg.wParam ;
10、LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)switch (message) case WM_CREATE: / 窗口创建产生的消息return 0 ; case WM_LBUTTONDOWN:MessageBox (NULL, “你好,我的 Visual C+世界! “, “问候 “, 0) ;return 0 ; case WM_DESTROY: / 当窗口关闭时产生的消息PostQuitMessage (0) ;return 0 ;return DefWindowProc
11、(hwnd, message, wParam, lParam) ; / 执行默认的消息处理3.1.1 简单的 Windows应用程序例 Ex_HelloWin 一个完整的 Windows应用程序程序运行后,单击鼠标左键,就会弹出一个对话框,结果如图 3.2所示。图 3.2 Ex_HelloWin运行结果3.1.1 简单的 Windows应用程序窗口过程函数 WndProc用来接收和处理各种不同的消息,而主函数 WinMain通常要完成以下几步工作:(1) 调用 API函数 RegisterClass注册应用程序的窗口类。(2) 调用相关 API函数创建和显示窗口,并进行其它必要的初始化处理。其
12、中,函数 CreateWindow用来创建已注册窗口类的窗口。 Windows每一个窗口都有一些基本属性,如窗口标题、窗口位置和大小、应用程序图标、鼠标指针、菜单和背景颜色等。窗口类就是充当这些属性的模板。(3) 创建和启动应用程序的消息循环。 Windows应用程序接受各种不同的消息,包括键盘消息、鼠标以及窗口产生的各种消息。 Windows系统首先将消息放入消息队列中,应用程序的消息循环就是从应用程序的消息队列中检取消息,并将消息发送相应的窗口过程函数中作进一步处理。 API函数 GetMessage 和 DispatchMessage就是起到这样的作用。(4) 如果接收到 WM_QUIT消息,则退出应用程序。