第4章MFC基本应用程序的建立 41 Windows编程基础 4.2编制一个MFC应用程序 43使用 MFC Appwizard 4.4使用 Classwizard 作业
第4章MFC基本应用程序的建立 4.1 Windows编程基础 4.2 编制一个MFC应用程序 4.3 使用MFC AppWizard 4.4 使用ClassWizard 作业
4.1 Windows编程基础 41.1简单的 Windows应用程序 [例 Ex_ HelloMsg]一个简单的 Windows应用程序。 #include int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MessageBox(NULL,"你好,我的 Visual c++世界!","问候",0); return i 运行上述程序需要进行以下步骤: 选择“Fie”New”。单击 Projects,选中Win32 Application项 在 Project Name框中键入项目名称 Ex_ HelloMsg。在 Location下的编辑框中 直接键入文件夹名称,或单击 Browse按钮(…)选择一个已有的文件夹。 单击[OK]。选中 An empty project项。单击[ Finish],单击[OK系统将自动 创建此应用程序 选择“File→>“NeW。单击File标签,在左边的列表框中选择C++ Source File项,在右边的File框中键入 Ex_ HelloMsg cpp,单击[OK]
4.1Windows编程基础 4.1.1简单的Windows应用程序 [例Ex_HelloMsg] 一个简单的Windows应用程序。 #include int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MessageBox (NULL, "你好,我的Visual C++世界!", "问候", 0) ; return 0 ; } 运行上述程序需要进行以下步骤: ➢ 选择“File”→“New”。单击Projects,选中Win32 Application项。 ➢ 在Project Name框中键入项目名称Ex_HelloMsg。在Location下的编辑框中 直接键入文件夹名称,或单击Browse按钮(...)选择一个已有的文件夹。 ➢ 单击[OK]。选中An empty project项。单击[Finish],单击[OK]系统将自动 创建此应用程序。 ➢ 选择“File”→“New”。单击File标签,在左边的列表框中选择C++ Source File项,在右边的File框中键入Ex_HelloMsg.cpp,单击[OK]
4 Windows编程基础 候 输入上面的代码,运行程序,如图 你好,我的 Vi sual c+世界 确定 从程序可以看出: Ex HelloMsg运行结果 传统的DOS程序以man函数作为进入程序的初始入口点,但在 Windows应 用程序中,main函数被 WinMain函数取而代之, Winmain函数的原型如下: int WINAPI Win Main( NSTANCE hinstance∥/当前实例句柄 HINSTANCE hPrevInstance,∥/前一实例句柄 LPSTR lpCmdline ∥/指向命令行参数的指针 nt ncmdshow ∥/窗口的显示状态 句柄是一个标识 Windows资源(如菜单、图标、窗口等)和设备等对象的变量, 或者是一个对操作系统资源的间接引用。 >每一个 Windows应用程序都需要 Windows. h头文件,它还包含了其他的一些 Windows头文件。这些头文件定义了 Windows的所有数据类型、函数调用、 数据结构和符号常量。 MessageBox是一个Win32API( Application Programming Interface,应用程 序接口)函数,用来弹出一个对话框窗口,显示短信息。该函数第一个参数 用来指定父窗口句柄,即对话框所在的窗口句柄。 个参数分别用来 指定显示的消息内容和对话框窗口的标题,最后一个参数用来指定在对话框 中显示的按钮
4.1Windows编程基础 ➢ 输入上面的代码,运行程序,如图。 从程序可以看出 : ➢ 传统的DOS程序以main函数作为进入程序的初始入口点,但在Windows应 用程序中,main函数被WinMain函数取而代之,WinMain函数的原型如下: int WINAPI WinMain ( HINSTANCE hInstance, // 当前实例句柄 HINSTANCE hPrevInstance, // 前一实例句柄 LPSTR lpCmdLine, // 指向命令行参数的指针 int nCmdShow) // 窗口的显示状态 ➢ 句柄是一个标识Windows资源(如菜单、图标、窗口等)和设备等对象的变量, 或者是一个对操作系统资源的间接引用。 ➢ 每一个Windows应用程序都需要Windows.h头文件,它还包含了其他的一些 Windows头文件。这些头文件定义了Windows的所有数据类型、函数调用、 数据结构和符号常量。 ➢ MessageBox是一个Win32 API(Application Programming Interface, 应用程 序接口)函数,用来弹出一个对话框窗口,显示短信息。该函数第一个参数 用来指定父窗口句柄,即对话框所在的窗口句柄。第二、三个参数分别用来 指定显示的消息内容和对话框窗口的标题,最后一个参数用来指定在对话框 中显示的按钮。 图4.1 Ex_HelloMsg运行结果
4 WIndows编程基础 [例 Ex Hellowin]一个完整的 Windows应用程序。 #include LRESULT CALLBACK Wnd Proc(HWND, UINT, WPARAM, LPARAM);∥/窗口过程 nt WiNAPi Win Main(HINSTANCE hInstance, hinSTaNCe hPrevinstance, LPSTR pCmdLine, int nCmdShow) HWND hwnd i ∥/窗口句柄 MSG msg i ∥/消息 WNDCLASS wndclass ∥/窗口类 wndclass style =CS_HREDRAWI CS-VREDRAW i wndclass. IpfnWndProc= WndProc wndclass. cbClsExtra 0 wndclass. cbWndExtra=0i wndclass hInstance= hInstance wndclass hIcon= LoadIcon(NULL, IDI_ APPLICATION); wndclass h Cursor= Load Cursor(NULL, IDC_ARROW)i wndclass hbr Background= (HBRUSH) GetstockObject(WHITE_BRUSH) wndclass. IpszMenuName= NUL wndclass. IpszclassName=“" Hellowin”; ∥/窗口类名 if (!RegisterClass( &wndclass)) /注册窗口 MessageBox(NUL,"窗口注册失败!"," Hellowin",0); return 0
4.1Windows编程基础 [例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 wndclass ; // 窗口类 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= (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName= NULL ; wndclass.lpszClassName= “HelloWin”; // 窗口类名 if (!RegisterClass (&wndclass)) // 注册窗口 { MessageBox (NULL, "窗口注册失败!", "HelloWin", 0) ; return 0 ; }
4.1 Windows编程基础 hwnd= CreateWindow( HelloWin ∥/窗口类名 我的窗口" ∥/窗口标题 WS_ OVERLAPPEDWINDOW,∥/窗口样式 CW USEDEFAULT ∥/窗口最初的x位置 CW USEDEFAULT ∥/窗口最初的y位置 CW_ USEDEFAULT ∥/窗口最初的x大小 CW USEDEFAULT ∥/窗口最初的y大小 NULL ∥/父窗口句柄 NULI ∥/窗口菜单句柄 hInstance, ∥/应用程序实例句柄 NULL)i ∥/创建窗口的参数 Show Window(hwnd, nCmdShow)i ∥/显示窗口 UpdateWindow(hwnd) ∥/更新窗口,包括窗口的客户区 ∥/进入消息循环:当从应用程序消息队列中检取的消息是 WM_ QUIT时,则退出循环 while(GetMessage(&msg, NULL, 0, o)) t TranslateMessage( &msg ∥/转换某些键盘消息 DispatchMessage(&msg)i ∥/将消息发送给窗口过程,这里是 Wnd Proc } return msg. wParam
4.1Windows编程基础 hwnd = CreateWindow ("HelloWin", // 窗口类名 "我的窗口", // 窗口标题 WS_OVERLAPPEDWINDOW, // 窗口样式 CW_USEDEFAULT, // 窗口最初的 x 位置 CW_USEDEFAULT, // 窗口最初的 y 位置 CW_USEDEFAULT, // 窗口最初的 x 大小 CW_USEDEFAULT, // 窗口最初的 y 大小 NULL, // 父窗口句柄 NULL, // 窗口菜单句柄 hInstance, // 应用程序实例句柄 NULL) ; // 创建窗口的参数 ShowWindow (hwnd, nCmdShow) ; // 显示窗口 UpdateWindow (hwnd) ; // 更新窗口,包括窗口的客户区 // 进入消息循环:当从应用程序消息队列中检取的消息是WM_QUIT时,则退出循环。 while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; // 转换某些键盘消息 DispatchMessage (&msg) ; // 将消息发送给窗口过程,这里是 WndProc } return msg.wParam ; }
4.1 Windows编程基础 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM WParam LPARAM IParam) switch(message) case WM create ∥/窗口创建产生的消 return o case WM LBUTTONdOWN MessageBox(NUL,"你好,我的 Visual c++世界!","问候",0) return o case WM destroy ∥/当窗口关闭时产生的消息 PostQuitMessage(0)i return 0 return defwindow proc( hwnd, message, pAran, IParam);∥/执行默认的消息 处理
4.1Windows编程基础 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 (hwnd, message, wParam, lParam) ; // 执行默认的消息 处理 }
4.1 Windows编程基础 程序运行,单击鼠标左键,如图。 窗口过程函数 WndProc用来接收和处理各种不同的消息, WinMain函数通常 要完成 >调用API函数 Register Classi注册应用程序的窗口类 调用相关API函数创建和显示窗口,并进行必要的初始化。 Create Window 创建已注册窗口类的窗口。 Windows每一个窗口都有一些基本属性。窗口 类就是充当这些属性的模板。 创建和启动应用程序的消息循环。 Windows应用程序接受各种不同的消息。 Windows系统首先将消息放入消息队列中,应用程序的消息循环就是从 用程序的消息队列中检取消息,并将消息发送相应的窗口过程函数中作进 步处理 如果接收到 WM QUT消息,则退出应用程序 我的窗口 你好,我的vsua1c+世界 图42 Ex Hellowin运行结果
4.1Windows编程基础 程序运行,单击鼠标左键,如图。 窗口过程函数WndProc用来接收和处理各种不同的消息,WinMain函数通常 要完成: ➢ 调用API函数RegisterClass注册应用程序的窗口类。 ➢ 调用相关API函数创建和显示窗口,并进行必要的初始化。CreateWindow 创建已注册窗口类的窗口。Windows每一个窗口都有一些基本属性。窗口 类就是充当这些属性的模板。 ➢ 创建和启动应用程序的消息循环。Windows应用程序接受各种不同的消息。 Windows系统首先将消息放入消息队列中,应用程序的消息循环就是从应 用程序的消息队列中检取消息,并将消息发送相应的窗口过程函数中作进 一步处理。 ➢ 如果接收到WM_QUIT消息,则退出应用程序 图4.2 Ex_HelloWin运行结果
4.1 Windows编程基础 应用程序的基本流程,如图 图43 Windows应用程序的基本流程
4.1Windows编程基础 应用程序的基本流程,如图。 图4.3 Windows应用程序的基本流程
4.1 Windows编程基础 412 Windows编程特点 >消息驱动机制 DOS程序是通过调用系统的函数来获得用户输入的, Windows程序则是通 过操作系统发送的消息来处理用户输入的 无论是系统产生的动作或是运行应用程序产生的动作,都称为事件( Events) 生的消息( Message)。在应用程序中,通过接收消息、分发消息、处理消 息来和用户进行交互。许多消息都经过了严格的定义,并且适用于所有的 应用程序。 图形设备接口(GDI) DOS环境中,要在打印机上打印一幅图形是非常复杂的事件。 Windows则 提供了一个抽象的接口,称为图形设备接口( Graphical Device Interface, 简称GDI),使得用户直接利用系统的GDI函数就能方便实现输入或输出,而 不必关心与系统相连的外部设备的类型 基于资源的程序设计 Windows应用程序常常包含众多图形元素,每一个这样的元素都作为一种 可以装入应用程序的资源来存放。这些资源可以被编辑、修改,也可以被 其他应用程序所共享。VC中提供的许多编辑器能“所见即所得”地进行不 同类型资源的设计、编辑等
4.1Windows编程基础 4.1.2Windows编程特点 ➢ 消息驱动机制 DOS程序是通过调用系统的函数来获得用户输入的,Windows程序则是通 过操作系统发送的消息来处理用户输入的。 无论是系统产生的动作或是运行应用程序产生的动作,都称为事件(Events) 产生的消息(Message)。在应用程序中,通过接收消息、分发消息、处理消 息来和用户进行交互。许多消息都经过了严格的定义,并且适用于所有的 应用程序。 ➢ 图形设备接口(GDI ) DOS环境中,要在打印机上打印一幅图形是非常复杂的事件。Windows则 提供了一个抽象的接口,称为图形设备接口(Graphical Device Interface, 简称GDI),使得用户直接利用系统的GDI函数就能方便实现输入或输出,而 不必关心与系统相连的外部设备的类型。 ➢ 基于资源的程序设计 Windows应用程序常常包含众多图形元素,每一个这样的元素都作为一种 可以装入应用程序的资源来存放。这些资源可以被编辑、修改,也可以被 其他应用程序所共享。VC中提供的许多编辑器能“所见即所得”地进行不 同类型资源的设计、编辑等
4.1 Windows编程基础 >动态链接库 提供一些特定结构的函数,能被应用程序在运行过程中装入和连接,多个 程序可以共享同一个动态链接库。从编程角度,动态链接库可以提高程序 模块的灵活性,它本身是可以单独设计、编译和调试的 Windows提供了应用程序可利用的丰富的函数调用,大多数用于实现其用 户界面和在显示器上显示的文本和图形,都是通过动态链接库来实现的 Windows中, KERNEL32用来处理存储器低层功能、任务和资源管理等核心 服务;GDI32用来提供图形设备接口,管理用户界面和图形绘制;USER32 负责窗口的管理 进程和线程 Windows是一个32位多任务操作系统,采用进程和线程的管理模式 进程是装入内存中正在执行的应用程序。进程包括私有的虚拟地址空间 代码、数据及其它操作系统资源。进程包括了一个或多个在进程上下文内 运行的线程。 线程是操作系统分配CPU时间的基本实体。线程可以执行应用程序代码的任 何部分,包括当前正在被其它线程执行的那些部分。同一进程的所有线程 共享同样的虚拟地址空间、全局变量和操作系统资源 个应用程序,包括一个或多个进程,每个进程由一个或多个线程构成
4.1Windows编程基础 ➢ 动态链接库 ◆ 提供一些特定结构的函数,能被应用程序在运行过程中装入和连接,多个 程序可以共享同一个动态链接库。从编程角度,动态链接库可以提高程序 模块的灵活性,它本身是可以单独设计、编译和调试的。 ◆ Windows提供了应用程序可利用的丰富的函数调用,大多数用于实现其用 户界面和在显示器上显示的文本和图形,都是通过动态链接库来实现的。 ◆ Windows中,KERNEL32用来处理存储器低层功能、任务和资源管理等核心 服务; GDI32用来提供图形设备接口,管理用户界面和图形绘制;USER32 负责窗口的管理。 ➢ 进程和线程 ◆ Windows是一个32位多任务操作系统,采用进程和线程的管理模式。 ◆ 进程是装入内存中正在执行的应用程序。进程包括私有的虚拟地址空间、 代码、数据及其它操作系统资源。进程包括了一个或多个在进程上下文内 运行的线程。 ◆ 线程是操作系统分配CPU时间的基本实体。线程可以执行应用程序代码的任 何部分,包括当前正在被其它线程执行的那些部分。同一进程的所有线程 共享同样的虚拟地址空间、全局变量和操作系统资源。 ◆ 一个应用程序,包括一个或多个进程,每个进程由一个或多个线程构成