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