1、1Visual C+第三章Windows 编程基础2022-11-252内容提要 Windows编程基础知识 Windows应用程序常用消息 Windows中的事件驱动程序设计 Windows应用程序组成及编程步骤2022-11-253.1.Windows编程基础知识 集资源和工具于一体的开发系统可视化开发系统可视化开发系统(资源和工具的集成资源和工具的集成)源程序源程序编辑器编辑器编译器编译器调试工具调试工具语法检查语法检查程序修改程序修改运行监视运行监视应用程序应用程序Help和和Setup开发工具开发工具函数库和函数库和系统函数系统函数开发工具开发工具资源管理器资源管理器各种窗口和各种窗
2、口和控件的编辑器控件的编辑器例程库例程库及及Help其他其他功能功能2022-11-253.1.Windows编程基础知识Windows的程序设计语言“面向对象(Object-Oriented)”的语言VC+,VB和VJ适合于Windows的程序开发。Windows的程序中,对象是具有规范形态和操作模式的部件:窗口 菜单 按钮 对话框 程序模块2022-11-2553.1.Windows编程基础知识Windows的程序设计方法 传统编写法-使用API(Application Programming Interface)交互式方法-使用MFC (Microsoft Foundation Clas
3、s)编写Windows程序主要工作:在创建对象 为对象属性赋值2022-11-25 应用程序接口API 定义Win系统各种特殊函数及数据结构 包含上千个可调用系统功能的标准API函数 实现应用程序与Win系统间的标准程序接口 API函数实现三种功能 窗口管理函数窗口的创建、移动和修改 图形设备(GDI)函数与设备无关的图形操作 系统服务函数与操作系统有关的多种服务3.1 Windows编程基础知识2022-11-25用MFC库交互式可视化编程 MFC类库含有大量已定义好的类(class),可根据编程的需要,调用相应的类,或自定义有关的类 实现可视化交互开发方式 选择所需对象并确定其属性,搭建起
4、应用程序的“大框架”,编写必要的细节代码段,构成完整的应用程序。3.1 Windows编程基础知识2022-11-258 API函数和MFC类库编程需了解的相关概念 窗口(Window)事件驱动(Event-driven)句柄(Handle)消息(Message)3.1 Windows编程基础知识2022-11-253.1 Windows编程基础知识(1)窗口2022-11-2510 窗口及其功能 系统对应用程序管理的基本单位 应用程序与用户之间交互的接口环境 Window应用程序基本的操作单元 Win应用程序编程 创建一个或多个窗口 Win应用程序运行 窗口内部、窗口与窗口之间、窗口与系统之
5、间进行数据处理与交换的过程。3.1 Windows编程基础知识2022-11-2511(2)事件驱动相关概念 事件一种情况或一种活动的发生、或一种指定状态的变化,例如:按下鼠标 事件驱动由描述事件发生的信息(消息)来驱动程序的执行。程序的执行取决于事件发生的顺序;消息的产生并不要求有次序之分。事件驱动编程方法 针对事件或消息的处理进行;适于编写交互式程序。3.1 Windows编程基础知识2022-11-2512(3)句柄相关概念 句柄用于标识不同的对象和同类对象中不同的实例的标识符,一个其长度为4字节长整数值。句柄是Win应用程序编程的基础,应用程序通过句柄访问相应的对象信息。3.1 Win
6、dows编程基础知识2022-11-2513 句柄标识的对象实例 窗口 按钮 图标 滚动条 输出设备 控件 文件.。常用句柄类型HWND 窗口句柄HINSTANCE 前实例句柄HCURSOR 光标句柄HFONT 字体句柄HPEN 画笔句柄HBRUSH 画刷句柄HDC 设备环境句柄HBITMAP 位图句柄HICON 图标句柄HMENU 菜单句柄HFILE 文件句柄3.1 Windows编程基础知识2022-11-25143.1 Windows编程基础知识2022-11-2515(4)消息相关概念 应用程序利用消息与系统及其它应用程序进行信息交换。消息的三个组成部分:消息号:由事先定义好的消息名标
7、识 字参数(wParam):用于提供消息的附加信息 长字参数(lParam):用于提供消息的附加信息附加信息附加信息 与具体消息号的值有关与具体消息号的值有关3.1 Windows编程基础知识2022-11-25消息用结构MSG表示typedef struct tagMSG HWND hwnd;/窗口句柄,为null,则检索队的所有消息 UINT message;/消息号,由Windows.h中的宏定义来标识 WPARAM wParam;/消息的附加信息 LPARAM lParam;/消息的附加信息 DWORD time;/指定消息送至队列的时间 POINT pt;/指定消息发送时屏幕光标的位
8、置,MSG;数据类型说明数据类型说明:Windows Data Types windef.h3.1 Windows编程基础知识2022-11-2517 消息的分类 各种消息分类,分别以不同的前缀表示:BM 按钮控制消息。CB 组合框控制消息。DM 默认下压式按钮控制消息。EM 编辑控制消息。LB 列表框控制消息。SBM 滚动条控制消息。WM 窗口消息。3.1 Windows编程基础知识2022-11-25183.2.Windows应用程序常用消息 窗口管理消息 初始化消息 输入消息 系统消息 剪贴板消息 控制处理消息 控制通知消息 滚动条通知消息 非用户区消息 MDI消息 DDE消息 应用程序
9、自定义的消息2022-11-25193.2.Windows应用程序常用消息(1)WM_LBUTTONDOWN:单击鼠标左键的消息,附加信息:lParam当前光标位置 低字节为X坐标值 高字节为Y坐标值wParam整数以标识鼠标键的按下状态 MK_LBUTTON按下鼠标左键 MK_MBUTTON按下鼠标中键 MK_RBUTTON按下鼠标右键2022-11-25203.2.Windows应用程序常用消息 类似的鼠标左右键消息还有:WM_LBUTTONUP:放开左键;WM_RBUTTONDOWN:单击右键;WM_RBUTTONUP:放开右键;WM_LBUTTONDBLCLK:双击左键;WM_RBUT
10、TONDBLCLK:双击右键。2022-11-25213.2.Windows应用程序常用消息(2)WM_KEYDOWN:Posted to the window with the keyboard focus when a nonsystem key is pressed.A nonsystem key is a key that is pressed when the ALT key is not pressed.wParam 按下键的虚拟键码,标识按或放。lParam 记录按键的重复次数、扫描码、转移代码及先前键的状态等信息。相似的消息:WM_KEYUP,放开非系统键时产生2022-11-
11、25223.2.Windows应用程序常用消息(3)WM_ CHAR:Posted to the window with the keyboard focus when a WM_KEYDOWN message is translated by the TranslateMessage function.The WM_CHAR message contains the character code of the key that was pressed.wParam按下键的ASCII码。lParam与WM_KEYDOWN的相同。2022-11-25233.2.Windows应用程序常用消息(4
12、)WM_CREATE:由CreateWindow函数发出的消息。wParam未用。lParam个指向CREATESTRUCT数据结构的指针。(5)WM_CLOSE:关闭窗口时产生的消息。wParam和lParam均未用。(6)WM_DESTROY:由DestroyWiodow函数发出的消息。wParam和lParam均未用。2022-11-25243.2.Windows应用程序常用消息(7)WM_QUIT 退出应用程序时由PostQuitMessage函数发出的消息。wParam标识退出时的有关信息。lParam未用。(8)WM_PAINT 用户区移动或显示、用户窗口改变大小 程序通过滚动条滚
13、动窗口 下拉式菜单关闭并需要恢复被覆盖的部分 Windows清除对话框等对象,并需要恢复被覆盖的部分2022-11-25253.3 Windows中的事件驱动程序设计 计算平均成绩计算平均成绩启动启动输入姓名输入姓名输入第一次测试成绩输入第一次测试成绩输入第二次测试成绩输入第二次测试成绩输入第三次测试成绩输入第三次测试成绩计算平均成绩计算平均成绩结束结束过程驱动方法过程驱动方法启动启动消息处理消息处理结束结束输入姓名输入姓名输入第一次成绩输入第一次成绩输入第二次成绩输入第二次成绩输入第三次成绩输入第三次成绩计算平均成绩计算平均成绩事件驱动方法事件驱动方法2022-11-25263.4.Wind
14、ows应用程序组成及编程步骤 3.4.1 应用程序的组成 3.4.2 源程序组成结构 3.4.3 应用程序举例2022-11-25273.4.1 应用程序的组成 一个完整的Windows应用程序通常包含如下几种类型的文件:C/C+语言源程序文件(.c或.cpp)头文件(.h)模块定义文件(.def)资源描述文件(.rc)项目文件(.mak).2022-11-25283.4.2 源程序组成结构 WinMain和WndProc是Windows应用程序的主体 入口函数WinMain Every Windows program includes an entry-point function that
15、 is named either WinMain or wWinMain.所有应用程序的入口,类似Main函数,完成一系列的定义和初始化,并产生消息循环 窗口函数WndProc An application-defined function that processes messages sent to a window.处理消息2022-11-25 三个基本的组成部分:函数说明 初始化 消息循环 功能 注册窗口类,建立窗口及初始化 进入消息循环,根据接受的消息调用相应的处理过程 当消息循环检索到WM_QUIT时终止程序运行WinMain函数2022-11-25WinMain函数(1)函数说明
16、int WINAPI WinMain(HINSTANCE hThisInst,应用程序当前实例句柄 HINSTANCE hPrevInst,应用程序其他实例句柄 LPSTR lpszCmdLine,指向命令行参数的指针 Int nCmdShow初始窗口显示方式的整数值标识)注意!注意!Win是多任务管理的,同一应用程序可能同时存是多任务管理的,同一应用程序可能同时存在多个窗口,在多个窗口,Win系统对每个窗口的执行称为一个实例,系统对每个窗口的执行称为一个实例,并用一个实例句柄来唯一标识并用一个实例句柄来唯一标识2022-11-25WinMain函数(2)初始化 窗口类的定义:定义窗口的形式与
17、功能窗口类的定义:定义窗口的形式与功能 LoadIcon()LoadCursor()GetStockObject()窗口类的注册:窗口类必须先注册后使用窗口类的注册:窗口类必须先注册后使用 RegisterClass()创建窗口实例创建窗口实例 CreateWindow()显示窗口显示窗口 ShowWindow()UpdateWindow()2022-11-25(a)窗口类定义窗口类定义 通过给窗口类WNDCLASS赋值完成,该数据结构中包含窗口类的各种属性。窗口类定义常用以下函数:LoadIcon加载一个窗口图标。其原型为:HICON LoadIcon(HINSTANCE hInstance
18、,LPCTSTR lpIconName)图标资源名或系统预定义图标标识名图标资源模块句柄WinMain函数(2)初始化2022-11-25 LoadCursor加载一个窗口光标HCURSOR LoadCursor(HINSTANCE hInstance,LPCTSTR lpCursorName)GetStockObject获取系统提供的背景刷HBRUSH GetStockObject(int nBrush);光标资源名或系统预光标资源名或系统预定义图标标识名定义图标标识名光标资源模块句柄光标资源模块句柄WinMain函数(2)初始化2022-11-25(b)注册窗口类 Win系统提供部分预定义
19、的窗口类,程序员也可以自定义窗口类,窗口类必须先注册后使用。由函数RegisterClass()实现注册。RegisterClass(&wndclass);/wndclass为窗口类结构 RegisterClass函数的返回为布尔值,注册成功则返回真WinMain函数(2)初始化2022-11-25(c)创建窗口示例HWND Create Window (LPCTSTR lpszClassName,窗口类名 LPCTSTR lpszTitle,窗口标题名 DWORD dwStyle,创建窗口的样式 int x,y,窗口左上角坐标 int nWidth,nHeight,窗口宽度和度高 HWND
20、hwndParent,该窗口的父窗口句柄 HWENU hMenu,窗口主菜单句柄 HINSTANCE hInstance,应用程序当前句柄 LPVOID lpParam 传递给窗口的参数值的指针 )WinMain函数(2)初始化2022-11-25常用窗口样式标标识识说说明明WS_BORDER创创建建一一带带边边框框的的窗窗口口WS_CAPTION创创建建一一带带标标题题栏栏的的窗窗口口WS_HSCROLL创创建建一一带带垂垂直直滚滚动动条条的的窗窗口口WS_MAXIMIZEBOX创创建建一一带带最最大大化化框框的的窗窗口口WS_MAXIMIZE创创建建一一最最大大尺尺寸寸的的窗窗口口WS_M
21、INIMIZEBOX创创建建一一带带最最小小化化框框的的窗窗口口WS_MINIMIZE创创建建一一最最小小尺尺寸寸的的窗窗口口WS_OVERLAPPED创创建建一一带带边边框框和和标标题题的的窗窗口口WS_OVERLAPPEDWINOW创创建建一一带带边边框框、标标题题栏栏、系系统统菜菜单单及及最最大大、最最小小化化框框的的窗窗口口WS_POPUP创创建建一一弹弹出出式式窗窗口口WS_POPUPWINDOW创创建建一一带带边边框框和和系系统统菜菜单单的的弹弹出出式式窗窗口口WS_SYSMENU创创建建一一带带系系统统菜菜单单的的窗窗口口WS_VSCROLL创创建建一一带带水水平平滚滚动动条条的
22、的菜菜单单WinMain函数(2)初始化2022-11-25(d)显示窗口 调用ShowWindow函数在屏幕上显示窗口ShowWindow(hwnd,nCmdshow);显示窗口后,调用UpdateWindow更新并绘制用户区,并发出WM_PAINT消息。UpdateWindow(hwnd);WinMain函数(2)初始化2022-11-2538消息循环的常见格式如下:MSG Msg;while(GetMessage(&Msg,NULL,0,0)TranslateMessage(&Msg);DispatchMessage(&Msg);WinMain函数(3)消息循环2022-11-2539
23、GetMessage 从消息队列中读取一条消息,并将消息放在MSG结构中 返回零值,即检索到WM_QUIT消息 时,程序结束循环并退出 TranslateMessage 将消息的虚拟键转换为字符信息 DispatchMessage 将消息传送到指定窗口函数WinMain函数(3)消息循环2022-11-25WinMain函数(3)消息循环2022-11-2541窗口函数WndProc 定义了应用程序对接收到的不同消息的响应 包含了对各种可能接收到的消息的处理过程 由一个或多个switch语句组成 每一条case语句对应一种消息,当应用程序接收到一个消息时,相应的case语句被激活并执行相应的响
24、应程序模块。2022-11-2542窗口函数WndProcLRESULT CALLBACK WndProc(HWND hwnd,UINT messgae,WPARAM wParam,LPARAM lParam)switch(message)message为标识的消息 case break;case WM_DESTROY:PostQuitMessage(0);default:return DefWindowProc(hwnd,message,wParam,lParam);return(0);为未定义处理过程的消息提供缺省处理在消息处理程序段中一般都有对WM_DESTROY的处理,该消息是关闭窗口
25、时发出的。它向应用程序发出WM_QUIT消息,请求退出处理函数:void PostQuitMessage(int nExitCode)/nExitCode为应用程序的退出代码2022-11-2543 DefWindowProc function Calls the default window procedure to provide default processing for any window messages that an application does not process.This function ensures that every message is process
26、ed.DefWindowProc is called with the same parameters received by the window procedure.窗口函数WndProc2022-11-25数据类型 Windows.h 包含了其它Windows头文件,定义了Windows 应用程序中包含种类繁多的数据类型。WINDEF.H WINNT.H WINBASE.H WINUSER.H WINGDI.H数数据据类类型型说说 明明WORD16位位无无符符号号整整数数LONG32位位有有符符号号整整数数DWORD32位位无无符符号号整整数数HANDLE句句柄柄UINT32位位无无符符号号整整数数BOOL布布尔尔值值LPTSTR指指向向字字符符串串的的32位位指指针针LPCTSTR指指向向字字符符串串常常量量的的32位位指指针针2022-11-25一些重要的数据结构 MSG 包含一个消息的全部信息,是消息发送的格式包含一个消息的全部信息,是消息发送的格式 WINDCLASS 包含一个窗口类的全部信息及属性 POINT:定义了屏幕上或窗口中的一个点的X和 Y坐标 RECT:定义了一个矩形区域并及其左上角和右下角的坐标2022-11-25463.4.3 应用程序举例 源代码:TestAPI