Presentation is loading. Please wait.

Presentation is loading. Please wait.

简要回顾 了解课程体系、课程目的和主要内容 掌握Windows编程涉及的一些主要概念 DOS程序和Windows程序的主要区别 窗口和程序

Similar presentations


Presentation on theme: "简要回顾 了解课程体系、课程目的和主要内容 掌握Windows编程涉及的一些主要概念 DOS程序和Windows程序的主要区别 窗口和程序"— Presentation transcript:

1 简要回顾 了解课程体系、课程目的和主要内容 掌握Windows编程涉及的一些主要概念 DOS程序和Windows程序的主要区别 窗口和程序
进程与线程 句柄、常用句柄 API与SDK 事件及消息(消息驱动/产生/传递/消息循环)

2 MFC的基本结构 2

3 主要内容 Visual C++开发环境的熟悉和使用 Ex_HelloWin程序进一步讲解 MFC的基本结构 MFC应用程序框架
窗口输入消息处理

4 Visual C++开发环境 标题栏 菜单栏 工具栏 工具栏 项目工作区窗口 文档窗口 输出窗口 输出窗口标签 状态栏

5 开发环境的菜单功能 File菜单中的命令主要用来对文件和项目进行操作 Edit菜单中的命令是用来使用户便捷地编辑文件内容
View菜单中的命令主要用来改变窗口和工具栏的显示方式,激活调试时所用的各个窗口等 Insert菜单中的命令主要用于项目及资源的创建和添加

6 开发环境的菜单功能 Project菜单中的命令主要用于项目的一些操作 Build菜单中的命令主要用来应用程序的编译、连接、调试、运行
Tools菜单中的命令主要用于选择或定制开发环境中的一些实用工具 Windows菜单中的命令主要用于文档窗口的操作 Visual C++ 提供了大量详细的帮助信息

7 开发环境的工具栏 标准工具栏 类向导工具栏 小型编连工具栏 工具栏的显示与隐藏、浮动与停泊
“Customize”对话框方式(Tools--Customize) 快捷菜单方式(任何工具栏处右击鼠标)

8 项目和项目工作区—目录结构 在VC中,项目中所有的源文件都是采用文件夹的方式进行管理的
将项目名作为文件夹名,在此文件夹下包含源程序代码文件(.cpp,.h)、项目文件(.dsp)以及项目工作区文件(.dsw)等 下面列出了其他一些文件类型的的含义: .opt 关于开发环境的参数文件,如工具条位置等信息 .aps(AppStudio File) 资源辅助文件,二进制格式 .clw ClassWizard信息文件 .dsp(DeveloperStudio Project) 项目文件 .plg 编译信息文件 .hpj(Help Project) 帮助文件项目

9 项目和项目工作区—目录结构 .mdp(Microsoft DevStudio Project) 旧版本的项目文件 .bsc 用于浏览项目信息
.map 执行文件的映像信息纪录文件 .pch(Pre-Compiled File) 预编译文件,可以加快编译速度,但是文件非常大 .pdb(Program Database) 记录程序有关的一些数据和调试信息 .exp 记录DLL文件中的一些信息,只有在编译DLL才会生成 .ncb 无编译浏览文件(no compile browser)

10 项目和项目工作区—目录结构 还有相应的Debug或Release、Res等子文件夹
VC应用程序向导创建项目时,系统会自动为项目创建Win32 Debug的运行程序,并使用相应的缺省配置 Win32 Release版本的区别在于 Debug版本的运行程序有相应的调试信息码 Release版本的运行程序没有 Release版本的运行程序经过代码的优化,其程序的运行速度被最大加速

11 项目和项目工作区 在开发环境中,VC是通过左边的项目工作区窗口来对项目进行各种管理 项目工作区窗口包含三个页面 ClassView页
ResourceView页 FileView页

12 项目和项目工作区 ClassView页 用以显示项目中的所有的类信息
假设打开的项目名为Ex_Sdi,单击项目区窗口底部的ClassView,则显示出“Ex_Sdi classes”的树状结点 在它的前面是一个图标和一个套在方框中的符号“+”,单击符号“+”或双击图标,Ex_Sdi中的所有类名将被显示 如CMainFrame、CEx_SdiApp、CEx_SdiDoc、CEx_SdiView等

13 项目和项目工作区 ResourceView页 FileView页 包含了项目中所有资源的层次列表。每一种资源都有自己使用的图标
创建一个新目录项,可在添加目录项的地方右击,选择“New Folder”,输入目录项名称和相关的文件扩展名,单击“OK”

14 资源 资源的分类 (1) 快捷键列表 (2) 工具栏按钮 (3) 鼠标指针 (4) 对话框 (5) HTML (6) 图标 (7) 菜单
(8) 字符串列表 (9) 版本信息

15 标识符 标识符的命名规则: 在标识符名称中允许使用字母a~z、A~Z、0~9以及下划线 标识符名称不区分大小写字母
不能以数字开头,如8BIT是不合法的标识符名 字符个数不得超过247个

16 资源基本操作 创建资源 (1) 从“Insert”菜单选取“Resource”;或用快捷键Ctrl+R打开对话框
[New]用来创建一个由Resource Type列表中指定类型的新资源 [Custom]按钮用来创建Resource Type列表中没有的新类型的资源 [Import]按钮用于将外部已有的位图、图标、光标或其他定制的资源添加到当前应用程序中 (2)  从Resource Type列表中选择一种资源类型,而后按[New]按钮 (3) 在项目工作区窗口的ResourceView页面中,看到了刚才选中的资源的缺省标识符,而且相应的资源编辑器自动打开

17 资源基本操作 打开资源 如果需要对已有资源进行查看或修改,可以首先切换到项目工作区窗口的ResourceView标签页,然后选中要打开的资源,双击鼠标左键或者按Enter键,这时相应的资源编辑器也会相应自动打开 保存资源 当设计或修改好一个资源后,用File菜单的Save菜单命令或利用快捷键Ctrl+S将其保存在当前资源文件中

18 资源基本操作 删除、复制资源 如删除一个已有的资源,首先切换到项目工作区窗口的ResourceView标签页,然后选中要打开的资源,按Del键或者利用Edit菜单下的Delete菜单项可实现删除 复制资源的过程与删除类似,选中要复制的资源,按住Ctrl键不放,并拖动鼠标左键或利用Edit菜单中的Copy和Paste菜单命令进行操作,同其他软件的复制过程相同

19 资源文件的管理 资源文件一经创建,其中所包含的资源也就随之而定,与资源相对应的标识符也被保存在Resource.h头文件中。 资源编辑器
一般,在一个资源文件.RC中所保存的所有资源已经满足的需要了,尽管如此,VC仍然允许用多个文件来存放资源 用View菜单中的Resource Includes菜单命令打开“Resource Includes”对话框时,可以看到Compile-time directives编辑框中已经含有#include "res\Ex_Sdi.rc2"。 资源编辑器 所有Windows资源都可以用VC提供的资源编辑器来编辑

20 一个控制台应用程序 实例创建(演示) 用AppWizard创建 理解程序框架 添加程序代码 编译运行

21 命名规则 函数命名规则 变量命名规则 函数名 = 动词 + 名词 动词和名词的第一个字母必须大写
例 GetMessage 变量命名规则 小写字母前缀表示变量的类型,其余的部分描述变量的功能 例 nCount

22 命名规则—示例 数据类型 定义 Win 32 变量名 BOOL int 32 位符号数 bOk INT int 32 位符号数 nCount
UINT unsigned int 32 位无符号数 uMsg LONG long 位符号数 lTotalSize

23 养成良好的编码习惯 操作数与操作符之间请空一格 若花括号可有可无,还是请写上 在花括号内部的代码要比花括号缩进一个TAB
如果你的代码已经很乱了,使用一组神奇的快捷键:Alt + F8 不要过份依赖这个快捷键,事实证明,总想偷懒的人不会有好结果 另一组快捷键可能也会用上:Shift + Tab

24 程序调试 修正语法错误(F4) 设置断点(F9) 启用/结束调试(F5 / Shift + F5) 控制程序运行(F10 & F11)
查看和修改变量的值 QuickWatch窗口的使用 Watch窗口的使用 Variables窗口的使用

25 主要内容 Visual C++开发环境的熟悉和使用 Ex_HelloWin程序进一步讲解 MFC的基本结构 MFC应用程序框架
窗口输入消息处理

26 Ex_HelloWin程序讲解(P92) Windows 应用程序结构 至少包含两个函数 WinMain ( ) : 必有且仅有一个
窗口函数 : 每个窗口对应一个窗口函数,以响应该窗口的消息

27 Win32程序需要什么函数库 Windows程序可调用的函数:
C Runtimes : 我们熟悉的printf , strcpy 等都属于这一类函数 Windows APIs : 由Windows本身三大模块(GDI32.DLL/USER32.DLL/KERNEL32.DLL)提供,在系统启动时自动加载

28 Win32程序需要什么头文件 最省力的方法:#include <windows.h>
该头文件非常庞大,大概有5000行之巨 不过如今已经将此文件分割成多个小文件可供编程者自行选用 如果你并不想仔细研究到底你的程序该用哪几个头文件,没有人会阻止你偷懒 若想使用三大模块之外提供的API函数,就得载入对应的头文件

29 WinMain( )函数需完成的功能 定义窗口类 注册窗口类 建立窗口类的窗口 显示窗口 运行消息循环

30 WinMain( )函数的原型 int WINAPI WinMain (HINSTANCE hThisInst, //当前实例
该句柄唯一地标识了该程序 为了与早期的版本兼容,这里未用,其值总是NULL int WINAPI WinMain (HINSTANCE hThisInst, //当前实例 HINSTANCE hPrevInst, //前一个实例 PSTR pszCmdLine, //指向命令行指针 int nCmdShow ) //显示方式 程序运行时的显示方式(正常、最大化、最小化等) 运行程序的命令行参数串

31 窗口类  WNDCLASS UINT style; //窗口类风格 WNDPROC lpfnWndProc; //窗口函数
int cbWndExtra; //窗口额外信息 int cbClsExtra; //类结构额外信息 HINSTANCE hInstance; //实例句柄

32 窗口类  WNDCLASS HICON hIcon; //图标句柄 HCURSOR hCursor; //光标句柄
HBRUSH hbrBackground; //窗口背景画刷句柄 LPCSTR lpszMenuName; //主菜单资源句柄 LPCSTR lpszClassName; //窗口类名字

33 hIcon 加载函数 HICON LoadIcon ( HINSTANCE hInst, LPCSTR lpszName)

34 hCursor 加载函数 HCURSOR LoadCursor ( HINSTANCE hInst, LPCSTR lpszName)

35 注册窗口类 ATOM RegisterClass (CONST WNDCLASS *lpWClass) 功能: 登记窗口类
功能: 登记窗口类 返回: 窗口类的唯一值 参数: 窗口类地址

36 创建窗口 HWND CreateWindow ( LPCSTR lpClassName, //窗口类名
LPCSTR lpWinName, //标题 DWORD dwstyle, //风格 int x,int y, //位置

37 创建窗口 int nWidth,int nHeight, //窗口长宽 HWND hParent, //父窗口句柄
HMENU hMenu, //菜单 HINSTANCE hThisInst, //实例 LPVOID lpszAdditional) //附加信息

38 窗口显示函数 BOOL ShowWindow ( HWND hwnd, int nCmdShow) 功能: 显示或隐藏窗口
功能: 显示或隐藏窗口 返回值: 可见状态 : 返回非零 ; 隐藏状态 : 返回零 nCmdShow可取的值: SW_HIDE 删除窗口 SW_MINIMIZ 极小化成一个图标 SW_MAXIMIZE 极大化成一个图标 SW_RESTORE 恢复成正常窗口

39 更新用户区域 BOOL UpdateWindow ( HWND hwnd ) 返回:更新成功返回真 参数:窗口句柄

40 获取消息 BOOL GetMessage ( LPMSG lpMsg, //存放消息 HWND hwnd,
//获取该窗口的消息,若为NULL, 则获取该应用程序的所有消息 UINT uMsgMin, //消息范围 UINT uMsgMax); 遇WM_QUIT消息为零

41 消息处理 BOOL TranslateMessage (LPMSG lpMsg) 功能:将虚拟键消息转换成字符消息
BOOL DispatchMessage (LPMSG lpMsg) 功能:驱动Windows,把消息传递给相应的窗口函数

42 窗口过程函数 窗口函数负责处理从系统接收的输入消息和窗口管理消息 CALLBACK回调函数 它由 Windows 直接调用

43 回调函数简介 回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件
通常情况下,回调函数采用标准Windows API的调用方式,即__stdcall DLL编制者也可以自已定义调用方式,但客户程序也必须遵守相同的规定 在__stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出

44 窗口过程函数消息处理 PostQuitMessage(nExitCode) 功能:发送WM_QUIT消息给系统, 以通知系统应用程序要结束
DefWindowProc(hwnd,message, wParam,lParam) 消息缺省处理函数

45 2 1 8 3 5 4 7 6 WinMain ( hInst, hPrev, … ) { MSG msg;
ReigsterClass (…); CreateWindow (…); ShowWindow (…); UpdateWindow (…); While ( GetMessage (&msg…)) { TranslateMessage (…); DispatchMessage (…); } return msg.wParam; WM_CREATE 消息队列 2 1 8 WM_QUIT 3 WndProc ( hWnd, msg, wParam, lParam ) { switch ( msg ) { case WM_CREATE : … case WM_PAINT : case WM_KEYDOWN : case WM_DESTROY : PostQuitMessage(0); break; default : return( DefWindowProc ( ... ) ); } return (0); WM_CLOSE 5 4 7 WM_DESTROY case WM_CLOSE : DestroyWindow (...); 6

46 主要内容 Visual C++开发环境的熟悉和使用 Ex_HelloWin程序进一步讲解 MFC的基本结构 MFC应用程序框架
窗口输入消息处理

47 MFC的含义 MFC—Microsoft Foundation Class Library, 微软基本类库
为了帮助用户处理那些经常使用又复杂繁琐的各种Windows操作 MFC把传统的Windows编程规范中的大多数内容封装成各种类 使程序员从繁杂的编程中解脱出来,提高了编程和代码效率 VC还提供了大量向导和可视化编辑工具,使用户不需要添加太多的代码就能实现不同风格和用途的应用程序

48 MFC AppWizard 是VC提供的一个非常有用的向导,称之为MFC应用程序向导
能为用户快速、高效、自动地生成一些常用的标准程序结构和编程风格 这些类型基本上能满足各个层次用户的不同需要 重点关注MFC AppWizard(exe)应用程序框架

49 应用程序框架 定义了应用程序的轮廓,为用户提供了标准的实现接口 Windows应用程序的建立都是基于这个框架展开的

50 MFC应用程序框架 包含用户最常用、最基本的三种应用程序类型 单文档应用程序(Windows记事本) 多文档应用程序 基于对话框的应用程序
功能较简单、负责程度适中 每次只能打开和处理一个文档 多文档应用程序 允许同时打开和处理多个文档 基于对话框的应用程序 最简单、最紧凑,没有菜单、工具栏、状态栏 不能处理文档,速度快、代码少,开发调试时间短

51 纵览MFC General Purpose Classes Windows API Classes
Application Framework Classes High Level Abstraction Afx Global Functions MFC Macro 例子:正弦波

52 General Purpose Classes
提供字符串、数组类、链表类… 适用于DOS和Windows CObject:万类之首,MFC绝大部分的类均派生于此 数据处理类(collection classes) CArray/CList CByteArray/CStringList 杂项类(不派生于CObject) CRect/CPoint/CSize CTime/CTimeSpan/CString

53 General Purpose Classes
CArray <TYPE,ARG_TYPE> className SetSize/GetSize SetAt/GetAt Add/Remove CList <TYPE,ARG_TYPE> className AddTail/InsertAfter/FindIndex GetHeadPosition/GetCount/GetNext CString 字符串的连接 数值 ↔ 字符串 CString与char*

54 Windows API Classes 最为经典的类群,这些类的成员函数都对应各个Windows API CCmdTarget
处理消息映射和传递 CWinThread 代表一个线程 CWinApp 代表整个程序 CWnd 所有窗口 GDI / CDC / CMenu MFC消息映射结构的基类。具有消息处理能力的类均应为该类的派生类 支持多个线程的并行执行。每个应用程序至少有一个线程(主线程)。此类封装了操作系统的调度功能 封装了Windows应用程序初始化、运行、终止应用程序的代码。基于框架建立的应用程序必须有一个且只有一个从此派生的类对象 各种窗口,包括对话框,子窗口、控制框等的通用基类,提供窗口处理中公共的窗口类注册、窗口创建与撤消等处理操作 图形类、设备类、菜单类的基类

55 Application Framework Classes
CDocument 负责对象的保存和读取 CView 负责将内容呈现在显示装置上 CDocTemplate 负责管理上面两个类,在两者之间提供一个桥梁

56 High Level Abstraction
CToolsBar CStatusBar CDialogBar CEditView CTreeView

57 MFC类层次图 CObject CCmdTarget CWnd CDocument CFrameWnd CWinApp CView
CWinThread CFrameWnd CWinApp CView

58 Afx Global Functions int AfxMessageBox( LPCTSTR lpszText,
UINT nType = MB_OK, UINT nIDHelp = 0 ); AfxRegisterClass

59 MFC Macro DECLARE_DYNAMIC IMPLEMENT_DYNAMIC DECLARE_DYNCREATE
IMPLEMENT_DYNCREATE DECLARE_MESSAGE_MAP BEGIN_MESSAGE_MAP ON_COMMAND ON_MESSAGE END_MESSAGE_MAP

60 MFC程序结构 两句话概括MFC如何封装API: 程序的起始点是 CMyWinApp theApp; 终点不可见
CWinApp取代WinMain 程序运行时,Windows自动调用该函数 CFrameWnd取代WndProc 程序的起始点是 CMyWinApp theApp; 终点不可见

61 MFC的诞生 Application object产生,从而获得对象内存
MFC会自动执行到CMyWinApp::InitInstance,在里面会创建一个CMyFrameWnd对象 CMyFrameWnd构造函数调用Create产生主窗口 回到CMyWinApp::InitInstance中ShowWindows并执行UpdateWindow,发出WM_PAINT MFC执行CMyWinApp::Run函数,进入消息循环

62 程序执行过程 WinMain(入口) 初始化应用程序 CMyWinApp::InitApplication 初始化实例 创建窗口
显示窗口 进入消息循环 结束应用程序 CMyWinApp::InitApplication CMyWinApp ::InitInstance CMyFrameWnd ::CMyFrameWnd CWnd::Create CWnd::ShowWindow CWnd::UpdateWindow CWinApp::Run CWindApp::ExitInstance

63 MFC的死亡 和纯Win32的死亡方式一样 只不过MFC把实现全部隐藏起来

64 消息映射 在类的头文件中: 在类的实现文件中: 这一切都可以由Classwizard代劳
DECLARE_MESSAGE_MAP() 消息处理函数声明 在类的实现文件中: 消息映射宏 消息处理函数实现 这一切都可以由Classwizard代劳 将发给对象的消息映射到类方法上,使相应的窗口或控件自动地处理消息

65 afx_msg void ClassMethod( )
消息映射的实现 类声明头文件:在处理消息的窗口类中声明消息响应宏和消息响应函数原型: DECLARE_MESSAGE_MAP( ) afx_msg void ClassMethod( ) 类实现源文件:声明消息映射图 BEGIN_MESSAGE_MAP//(派生类,基类) ON_MessageName(ID,ClassMethod) // 各种消息映射宏 END_MESSAGE_MAP( )

66 消息映射项和处理方法 消息响应函数原型: 消息映射宏: 消息响应函数的搜索路径: 自下而上,直到 CCmdTarget
afx_msg void ClassMethod( ) 消息映射宏: ON_MessageName(ID,ClassMethod) 消息响应函数的搜索路径: 自下而上,直到 CCmdTarget

67 VC能帮我们做什么 MFC Wizard: 快速生成一个MFC框架 Class Wizard: 快速插入消息映射图
(快捷键是CTRL+W / View菜单)

68 窗口输入消息处理 输入消息分类 鼠标消息: 用户区与非用户区 键盘消息: 系统键消息与非系统键消息

69 鼠标输入消息 afx_msg void OnMouse_ (UINT nFlags,Cpoint point)
afx_msg void On_Button_ (UINT nFlags,CPoint point) nFlags: 标识同时按下的虚拟键 point: 光标所在的位置

70 键盘输入消息 afx_msg void On_(UINT nChar, UINT nRepCnt,UINT nFlags)
nChar: 输入字符的ASCII nRepCnt: 重复击键的次数 nFlags: 虚拟键码...

71 内容回顾 Visual C++开发环境的熟悉和使用 Ex_HelloWin程序进一步讲解 MFC的基本结构 MFC应用程序框架
窗口输入消息处理

72 作业及下节课内容 作业 下节课主要内容 P118第7题,继续深刻理解 Ex_HelloWin 程序每一步的具体含义
熟练使用 Visual C++ 开发环境 P118第6题,尝试使用 Visual C++ 开发环境实现一个基于对话框的应用程序 下节课主要内容 基于对话框的应用程序 模式/无模式对话框


Download ppt "简要回顾 了解课程体系、课程目的和主要内容 掌握Windows编程涉及的一些主要概念 DOS程序和Windows程序的主要区别 窗口和程序"

Similar presentations


Ads by Google