Windows程序设计基础.ppt_第1页
Windows程序设计基础.ppt_第2页
Windows程序设计基础.ppt_第3页
Windows程序设计基础.ppt_第4页
Windows程序设计基础.ppt_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Windows程序设计基础 第07章 本章主要内容 几个基本概念 窗口消息驱动图形设备接口资源句柄API和SDK 1 窗口 对话框中的按钮 文本框等也是窗口它们具有同等地位 2 消息驱动 消息机制 消息传递操作系统感知事件 封装一个消息 描述事件的结构体 投递到程序的消息队列中 应用程序从消息队列中取出消息 调用对应的消息处理过程 消息结构typdefstructtagMSG HWNDhWnd UINTmessage WPARAMwParam LPARAMlParam DWORDtime POINTpt MSG 消息的标识 消息结构typdefstructtagMSG UINTmessage MSG Message成员是标识消息的整数 不同的消息数值不同 为了便于表达 定义形同WM XXX的消息宏 如WM KEYDOWN 特殊的数据类型 3 图形设备接口 4 资源 程序的构成程序代码UI 用户接口 资源 对话框 菜单 图标等资源的描述资源如图标 ico 位图 bmp 以二进制文件存在 资源描述文件 rc 描述所有资源 资源编译器将所有资源集中生成 res文件 最终的目标代码集成形成 exe文件 实现界面和代码的分离 5 句柄 Windows程序中 窗口和各种资源 图标 菜单 光标等 都使用句柄进行标识 系统在创建资源时 会为它们分配内存并返回句柄以作为标识 同种资源的不同实例标识不同 句柄本质上就是一个32位无符号整数值 假设屏幕上有10个窗口 Windows将它们编号为1 10 当又创建一个窗口时 将其编号为11 当应用程序读到11时 并知道11代表什么 但将11传递给Windows后 Windows自然知道是哪个窗口了 5 API和SDK API应用程序编程接口ApplicationProgrammingInterfaceWindows操作系统提供的编程接口 多数函数原型在windows h中声明 1000多个函数 单词首字母大写 MSDNSDK软件开发包SoftwareDevelopmentKitWin32SDK 微软提供的包括API函数 帮助文档 辅助工具等构成的开发包 本章主要内容 7 2 1API程序结构 入口函数 WinMain创建窗口建立消息循环窗口过程函数处理各种消息 创建最简单Windows程序 2API程序设计 创建最简单Windows程序 2API程序设计 创建最简单Windows程序 2API程序设计 创建最简单Windows程序 2API程序设计 创建最简单Windows程序 2API程序设计 WinMain 入口函数 WinMain原型intWINAPIWinMain HINSTANCEhInstance HINSTANCEhPrevInstance LPSTRlpCmdLine intnCmdShow 标识应用程序实例的句柄 前一个实例句柄Win32中恒为0 传递的命令行参数 定义窗口的初始状态 WINAPI解析 intWINAPIWinMain 函数调用中 有 stdcall和 cdecl两种约定 定义参数入栈次序 可变参数函数如printf遵循 cdecl约定 而Win32API遵循 stdcall约定 默认的编译选项为 cdecl 在声明时需显示指定 stdcall 为了保持兼容和便于使用 defineWINAPI stdcall defineCALLBACK stdcall 7 2 2创建窗口 创建窗口工作主要在WinMain中完成设计窗口类注册窗口类创建窗口显示窗口 1 设计窗口类 窗口类的概念创建窗口的 模板 指定将要创建窗口的特征窗口类通过一个结构体进行描述 typedefstruct WNDCLASS UINTstyle WNDPROClpfnWndProc intcbClsExtra intcbWndExtra HANDLEhInstance HICONhIcon HCURSORhCursor HBRUSHhbrBackground LPCTSTRlpszMenuName LPCTSTRlpszClassName WNDCLASS 常用属性介绍 style成员定义窗口的样式 如CS NOCLOSE CS VREDRAW等位标志 CS NOCLOSE值为0 x0200 CS VREDRAW的值为0 x0001 只有1位为1 组合属性style CS NOCLOSE CS VREDRAW去除属性style CS VREDRAW 常用属性介绍 lpfnWndProc回调函数 函数指针 Windows将消息交给该指针所指向函数处理 每个Windows程序 都必须提供一个窗口过程函数 并将函数地址赋值给窗口类的lpfnWndProc成员 typedefLRESULT CALLBACK WNDPROC HWND UINT WPARAM LPARAM defineLRESULTlong 2 注册窗口类 在使用窗口类创建窗口之前 还必须对窗口类进行注册 注册成功后才能创建窗口 ATOMRegisterClass CONSTWNDCLASS lpWndClass 函数的参数为之前定义的窗口类结构体变量的地址 3 创建窗口 使用CreateWindow创建窗口HWNDCreateWindow LPCTSTRlpClassName LPCTSTRlpWindowName DWORDdwStyle intx inty intnWidth intnHeight HWNDhWndParent HMENUhMenu HANDLEhInstance LPVOIDlpParam 4 显示窗口 ShowWindowBOOLShowWindow HWNDhWnd intnCmdShow nCmdShow指定显示方式SW HIDESW SHOWSW SHOWMAXIMIZEDSW SHOWMINIMIZED 5 更新窗口 UpdateWindowBOOLUpdateWindow HWNDhWnd 工作原理调用UpdateWindow后向指定的窗口发送消息WM PAINT 通常会在该消息处理过程中刷新窗口的输出 7 2 3建立消息循环 WinMain中 创建并显示窗口后 要为窗口建立消息循环经典结构MSGmsg while GetMessage 1 从消息队列取消息 GetMessageBOOLGetMessage LPMSGlpMsg HWNDhWnd UINTwMsgFilterMin UINTwMsgFilterMax 注解取得的消息保存在lpMsg定义的结构体中 hWnd常设置为NULL 接收所有消息 常将最后两个参数设置为0 while循环 消息循环的流程GetMessage收到WM QUIT消息后 返回0 循环结束 整个程序结束 收到其它消息 返回非0 继续循环 没有消息 则放弃执行 等待 2 消息转换 TranslateMessage按键时通常会产生WM KEYDOWN WM KEYUP等消息 参数中通常保存的是虚键值和扫描码 通过TranslateMessage 可以合成WM CHAR消息 参数中保存了ASCII码 3 分发消息 消息分发流程OS感知消息 将消息放到应用程序消息队列 GetMessage获取消息 DispatchMessage将消息回传给OS OS调用窗口过程函数 1 2 4窗口过程函数 程序的主要代码集中在窗口过程函数中LRESULTCALLBACKWindowPro HWNDhWnd UINTuMsg WPARAMwParam LPARAMlParam 要点 窗口过程函数名称可以随意 确保窗口类中的lpfnWndProc成员指向该函数 典型的窗口过程函数 LRESULTCALLBACKWindowPro switch uMsg caseWM CLOSE if IDYES MessageBox hWnd 是否结束 message MB YESNO DestroyWindow hWnd break caseWM DESTROY PostQuitMessage 0 break caseWM CHAR default returnDefWindowProc hWnd uMsg wParam lParam return0 注解 MessageBox MessageBox 弹出消息框 4个参数参数1 指定父窗口句柄参数2 指定消息正文参数3 指定消息框标题参数4 指定消息框中的图标和按钮用户点击不同按钮 返回值不同 MSDN 7 2 5完整的Window程序 1 设计窗口类 intWINAPIWinMain WNDCLASSwndcls wndcls cbClsExtra 0 wndcls cbWndExtra 0 wndcls hbrBackground HBRUSH GetStockObject WHITE BRUSH wndcls hCursor LoadCursor NULL IDC CROSS wndcls hIcon LoadIcon NULL IDI ERROR wndcls hInstance hInstance wndcls lpfnWndProc MyWinProc wndcls lpszClassName xiajb wndcls lpszMenuName NULL wndcls style CS HREDRAW CS VREDRAW RegisterClass 2 创建窗口 intWINAPIWinMain WNDCLASSwndcls RegisterClass 3 消息循环 intWINAPIWinMain RegisterClass 4 窗口过程 LRESULTCALLBACKMyWinProc HWNDhwnd UINTuMsg WPARAMwParam LPARAMlParam switch uMsg caseWM CLOSE if IDYES MessageBox hwnd 是否真的结束 确认结束程序 MB YESNO DestroyWindow hwnd break caseWM DESTROY PostQuitMessage 0 break case default returnDefWindowProc hwnd uMsg wParam lParam return0 窗口过程 LRESULTCALLBACKMyWinProc HWNDhwnd switch uMsg caseWM CHAR charszChar 40 sprintf szChar ASCIIis d wParam MessageBox hwnd szChar 按键通知 0 break caseWM LBUTTONDOWN MessageBox hwnd mouseclicked 鼠标单击通知 0 HDChdc hdc GetDC hwnd TextOut hdc 0 50 HelloWorld strlen HelloWorld ReleaseDC hwnd hdc break return0 本章主要内容 7 3 1MFC概述 关于ApplicationFrameWork应用程序框架是一个完整的程序模型 具备标准应用程序的基本功能 是一组紧密合作的 类 构建起来的大模型 程序模型是确定的 程序员只是根据个人需要 进行适当修改 如改写虚函数 添加成员函数 争议 软件创作在ApplicationFrameWord之后逐渐成为工匠技术 程序员们逐渐成为软件装配工程的男工和女工 为什么使用应用程序框架 软件技术发展的目标 降低软件编写难度和复杂度 加快开发效率 增强可维护性 增加可靠性 三大工具 rawAPIClassLibraryApplicationFrameWork MFC OWL等使用应用程序框架的好处开发效率和效益 API编程特点 程序主干由WinMain和WndProc两个函数构成 WinMain是Windows程序的入口函数 通常在该函数中注册 创建窗口 建立消息循环 当收到消息后调用WndProc进行处理 由系统实现的间接调用 在WndProc中 需要针对不同的消息 用户操作鼠标 点击菜单 按键 系统消息等 作出相应的处理 程序员应对数以千计的WindowsAPI函数 MFC应运而生 MFC帮助我们将繁多的API整合起来 利用面向对象原理 将其逻辑地组织起来 具备封装 继承 多态 模块化特点 将API编程中的众多的 一成不变 的内容隐藏在MFC类中 如WinMain 注册窗口 创建窗口等操作 使用众多精妙的宏和消息映射机制 大大简化程序员的工作 增强代码模块化 配合集成开发环境 AppWizard ClassWizard 资源编辑器 提高编程效率 AppWizard VC提供应用程序向导AppWizard 能快速生成应用程序框架 框架集成了几个相互作用的类 MFC已经建立了对象与对象之间的关系 设定了消息的流动程序 当要为应用程序设计一个应用功能时 不必要知道使用者如何按键 如何点击鼠标 只要注意按键之后真正要做的功能即可 MFC带来面向对象程序设计的观念和方法 并使我们能继承这些优秀工程技术人员的成果来开发自己所需要的程序 MFC的学习难点 API编程模式 程序结构清晰 从WinMain开始 注册窗口类 创建窗口 建立消息循环 窗口过程等 程序的流程比较清晰 MFC程序设计 高门槛隐藏 封装 了程序运行的基本过程 不理解众多的类及相互关系大量的宏及消息映射机制框架的约束 7 3 2AppWizard使用 生成MFC应用程序 项目类型 生成MFC应用程序 数据库选项 生成MFC应用程序 OLE选项 生成MFC应用程序 外观设置 设置基本的外观选项 生成MFC应用程序 附加选项 一般取默认值 生成MFC应用程序 变更类名 一般可取默认值 效果 3MFC程序设计 已经初具Windows程序规模 具备菜单 工具栏 标题栏 状态栏 窗口 构成程序的类 双击类名 定位到类定义处 双击类中的成员函数名 定位到该函数实现处 常用的类 CFirstApp 派生自CWinApp 代表整个MFC应用程序 CFirstView 派生自CView 代表屏幕上所看见的窗口 负责在显示设备上显示内容 CFirstDoc 派生自CDocument 在该类中添加数据成员 以便存储数据 CMainFrame 派生自CFrameWnd 代表程序框架 用于组织程序界面 菜单 工具栏 视图窗口 一般应用程序都会派生自己的应用程序 视图 文档和主框架类 名称和项目名称有关 本章主要内容 7 4 1消息处理的概念 消息处理是Windows应用程序的核心 消息通常由用户激发 也可能由操作系统 由操作系统捕获并分发到对应的程序 程序根据接收到的消息调用相应的处理过程 MFC通常为每个消息映射一个消息处理函数 并作为某个类的成员函数 编写MFC程序的主要任务 映射消息并编写消息处理代码 一个简单示例 显式鼠标位置 视图类中定义成员变量 代码分析 双击视图类CFirstView 切换至视图类定义中 在视图类中定义成员变量即可 认识CPoint MFC提供了许多封装成类的基本数据类型 CPoint是表示坐标点的类 含两个整型数据成员x和y CPointm MousePos 用来记录鼠标移动过程中当前坐标点 初始化成员 ClassWizard鼠标移动消息 ClassWizard鼠标移动消息 双击想映射的消息 添加消息处理代码 代码分析 当用户在客户区移动鼠标时 系统会不断捕获WM MOUSEMOVE消息 并将消息发送到应用程序 当应用程序通过自己的消息循环检测到WM MOUSEMOV消息时 便调用CFirstView的成员函数OnMouseMove 系统给该函数传递两个参数 其中point表示鼠标当前位置坐标 Invalidate 是从CView继承来的成员函数 用于刷新整个视图窗口屏幕 刷新屏幕后会自动调用OnDraw 成员函数重新绘制屏幕 实现OnDraw虚函数 双击鼠标定位到OnDraw函数体 函数代码 voidCFirstView OnDraw CDC pDC CFirstDoc pDoc GetDocument ASSERT VALID pDoc CStringstr str Format X位置 d m MousePos x pDC TextOut m MousePos x m MousePos y str str Format Y位置 d m MousePos y pDC TextOut m MousePos x m MousePos y 20 str 代码分析 机制 OnDraw是CView类的纯虚函数 必须在自己的视图类CFirstView中实现该函数 系统在视图窗口中绘图就是通过间接调用OnDraw实现的 这一机制被隐藏在MFC框架中 要画图 在OnDraw中添加具体的绘图代码即可 熟悉CString类 MFC用CString类封装对字符串的操作 在MFC程序中应用广泛 该类的Format成员可以按指定的格式设置字符串 类似printf的用法 代码分析 OnDraw函数中有一个参数pDC 用来指向设备环境类对象 可以指向屏幕输出设备 也可以指向打印设备 CDC类提供了大量的成员函数 实现对视图窗口的绘图和文本输出工作 TextOut用于在指定位置输出字符串 了解消息映射结构 消息映射的目的 将某个消息与某个类的成员函数关联起来 当收到该消息时 便自动调用与该消息关联的成员函数 成员函数声明 classCFirstView protected AFX MSG CFirstView afx msgvoidOnMouseMove AFX MSGDECLARE MESSAGE MAP 表示是消息映射函数 defineafx msg 了解消息映射结构 成员函数的实现消息映射表 在类实现文件头部BEGIN MESSAGE MAP CFirstView CView AFX MSG MAP CFirstView ON WM MOUSEMOVE AFX MSG MAP Standardprintingcommands END MESSAGE MAP 每映射一个消息会出现一个消息映射条目 不能破坏注释部分 ClassWizard的使用 选择正确的类和双击所要映射的消息后 自动完成函数声明 成员函数实现 添加消息映射条目等工作 程序员根据需要扩展修改实现代码即可 小结 MFC编程步骤 特点 使用AppWizard生成基本程序框架 使用资源编辑器设置或变更界面外观 使用ClassWizard将需要映射的消息映射到特定的类中 定位到消息处理成员函数中 编写代码 完成特定的功能 需要不断积累 适应MFC框架对程序创建 消息传递机制的封装 简化 逐步熟悉MFC中常用基本数据类型的使用 如CPoint CString CRect等 了解MFC类库的结构 熟悉常用基类中所提供的可供我们继承的方法 7 4 2消息介绍 Windows系统中的消息有近两千种 在编写程序时 绝大多数消息并不用映射 一般只映射用户感兴趣的消息 没有映射的消息由操作系统作默认处理 三大类消息 标准Windows消息控件消息 操作对话框中控件时产生的消息命令消息 菜单和工具栏按钮产生的消息 标准Windows消息 除WM COMMAND外 名称以WM 打头的消息都是Windows消息 Windows消息都有默认的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论