Download presentation
Presentation is loading. Please wait.
1
第1讲案例 涉及Windows与Visual C++基础
2
本讲目标 Windows编程的基本思想 MFC(Microsoft Foundation Class) 程序的基本结构
事件驱动和消息传递机制 MFC(Microsoft Foundation Class) 程序的基本结构 程序组成及各部分的作用
3
Windows编程的基本思想 事件驱动 运行机制 消息种类 程序的控制流不确定 根据用户的输入(消息)进行处理
程序开始运行时,处于等待消息状态,根据取得的消息作出相应的反应,处理完毕后又返回处于等待消息的状态 消息种类 输入消息、控制消息、系统消息、用户消息
4
工作流程图 消息队列 取得消息 处理消息 键盘消息 鼠标消息 其它消息
5
API Win32 API Application Programming Interface 早期的Windows应用程序开发
数以百计函数,难于记忆和应用
6
Win32 API程序流程 (1)用户启动应用程序,调用WinMain函数。
(2)WinMain函数注册一个窗口类(注意这里的类不同于C++中的类),用于标志应用程序主窗口的类型,同时采用WinMain函数来设置窗口程序函数名。 (3)WinMain函数调用CreateWindows API函数来创建应用程序主窗口。 (4)WinMain函数调用ShowWindows API函数来显示窗口。 (5)WinMain函数调用UpdateWindows API函数使应用程序重新绘制客户区中的内容。 (6)WinMain函数进入一个消息循环,等待接受各种消息。 (7)一个窗口在收到Windows消息后,分析消息的类型,并执行相应的消息处理函数。如果没有该消息的处理函数,则调用DefWindowsProc API函数来提供默认的处理。 (8)直到当应用程序消息循环遇到一个WM_QUIT消息时,退出WinMain函数,终止应用程序的运行。
7
MFC Microsoft Foundation Classes Library
MFC封装了大部分的Win32 API,包含用来开发C++应用程序和Windows应用程序的一组类,大大简化了Windows应用程序的开发 提供了Windows应用程序的框架
8
MFC 提供了大量的代码用于 你所需做的是 管理windows, menus, and dialog boxes;
执行basic input/output; 存储collections of data objects等 你所需做的是 在这个应用程序框架中加入自己的代码 可以容易地扩展或重载 MFC framework所提供的基本功能
9
MFC的类层次结构图 采用单一继承,从根类CObject层层派生出绝大多数MFC中的类,其层次结构是最典型。
10
编写MFC应用程序简介 一个MFC应用程序必须有且只能有一个CWinApp派生类的全局对象,其控制应用程序中的所有其它对象
CWinApp类封装了Windows应用程序从开始运行、消息传递、结束运行的所需步骤 开始时“不拘小节”,由浅入深、循序渐进、日积月累 利用VC++开发工具:AppWizard,ClassWizard,联机帮助等
11
Demo 1 例1-1 SDI版的“Hello World”
建立SDI项目, 并对视图类(CMyView)的OnDraw成员函数进行扩充以显示该字符串。 通过Workspace的ClassView迅速定位到OnDraw函数,并加入代码。 运行程序,在窗口中显示了一个矩形框,框中显示相应文字,而且无论怎样改变窗口的大小,矩形框总在窗口的中央。
12
Demo 1程序分析 Windows应用程序由frame window和其显示的document(s)组成,用户与document(s)进行交互 有两大类型: Single Document Interface (SDI) frame window Multiple Document Interface (MDI) frame window. 本例属于SDI类型
13
Demo 1程序分析 Windows负责管理用户与frame window的交互:
moving, resizing, closing, minimizing&maximizing 程序员负责处理frame window内的contents。 本例中加入了在框架窗口内显示矩形和“Hello World”的代码
14
Demo 1程序分析 5个类及其基类: CAboutDlg(CDialog) CMainFrame(CFrameWnd)
CMyApp(CWinApp) CMyDoc(CDocument) CMyView(CView)
15
Demo 1程序分析 各类的功能及其相互关系: view,frame和document之间的关系 CAboutDlg: 显示对话框,用于交互
CMainFrame: 管理框架,起容器作用 CMyApp: 管理程序:启动、初始化、结束 CMyDoc: 管理数据,通常用于永久数据的存取 CMyView: 显示数据,通常充当用户和Doc的中介 view,frame和document之间的关系 在app初始化时由CDocTemplate对象建立
16
SDI应用程序中的对象关系
17
Frame Window and View
18
Demo 1程序分析 CView::OnDraw 用于绘制窗口客户区内容 每当窗口重新绘制时,由程序框架调用
19
Demo 2 例2-1 鼠标和键盘的响应: 当鼠标在客户区点击时,弹出对话框并显示鼠标点击的坐标。
按下任意键时,弹出对话框并显示该键的名称。
20
Demo 2程序分析 处理2种事件:鼠标左击和键盘按键 相应的消息(输入消息): 相应的消息处理过程: WM_KEYDOWN
WM_LBUTTONDOWN 相应的消息处理过程: afx_msg void OnKeyDown(...); afx_msg void OnLButtonDown(...);
21
Demo 2程序分析 消息循环机制和消息处理机制在MFC中通过以下方式实现: message-map(消息映射) 消息映射成员函数
BEGIN_MESSAGE_MAP(CMyView, CView) ON_WM_KEYDOWN() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() 消息映射成员函数 afx_msg void OnKeyDown(...); afx_msg void OnLButtonDown(...);
22
Demo 2程序分析 View可以处理各种输入: 有些消息可以根据需要由其它类来处理 消息在各类中的传递过程如下
keyboard input mouse input input via drag-and-drop commands from menus, toolbars, or scroll bars 有些消息可以根据需要由其它类来处理 消息在各类中的传递过程如下 视窗类->文档类->框架类->应用程序类
23
Demo 2程序分析 在CMyView的类声明中添加重载函数原型: 在CMyView的类声明中添加宏:
afx_msg void OnKeyDown(...); afx_msg void OnLButtonDown(...); 在CMyView的类声明中添加宏: DECLARE_MESSAGE_MAP()
24
Demo 2程序分析 在CMyView的类实现中给出消息映射: 在CMyView的类实现中根据需要实现重载函数:
BEGIN_MESSAGE_MAP(CMyView, CView) ON_WM_KEYDOWN() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() 在CMyView的类实现中根据需要实现重载函数: void OnKeyDown(...){...} void OnLButtonDown(...){...}
25
Demo 2程序分析 当按下鼠标左键时,产生WM_LBUTTONDOWN消息
通过CMyView的OnLButtonDown成员函数响应该事件。
26
相关案例 案例1~案例9
27
忠 告 学好程序设计语言的唯一途径是 上机练习 你的编程能力与你在计算机上投入的时间成 正比
28
联系方式 教师:王群慧、庄天红 办公室电话:34204410 Mail: wang-qh@cs.sjtu.edu.cn
ftp: ftp://ftp.cs.sjtu.edu.cn/wang-qh ftp://ftp.cs.sjtu.edu.cn/zhuang-th ftp://cbase.sjtu.edu.cn/course-case
29
最终考试成绩 课时:3×18=54 最后总成绩: 平时上课情况(出勤+练习)占20% 平时作业占30% 最终大作业50%
30
讲解案例 基础案例3-5讲 MESSAGES: 俄罗斯方块(w) 苹果棋 RESOURCES: 机械仿真(w) 交通灯
DOCUMENTS&VIEW: 绘图程序(w) 简单翻译 DIALOG: 图示梵塔(w) 模拟时钟
Similar presentations