交互式绘图软件开发设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Windows API 函数在哪里?
Windows/System32/Kernel32.dll、 USER32.dll、GDI32.dll
怎样使用Windows API?
C和Windows SDK开发包( API函数是用纯C写的,都在 windows.h中有声明)
然而如今,C++取代了C,成为专业Windows程序员首选的 语言,所以MFC横空出世了…
•2013-7-31
// 已注册的窗口类名称 // 窗口标题栏中显示的文本 // 窗口样式 // 水平坐标 // 垂直坐标 // 宽度 // 高度 // 父窗口句柄 // 菜单句柄 // 应用程序实例句柄
// 用于多文档程序的附加参数,单文档为NULL
•20
Windows 程序内部运行机制
3. 消息循环与发送消息
前言
什么是Windows编程? 1. 你编写的程序是否遵循了Windows的编 程模型? 2.是否调用了Windows操作系统的应用程 序编程接口函数API,或者对其封装后 的基础类库(如MFC)。
•2013-7-31
•1
前言
关于Windows编程的三个问题
1. 什么是Windows API? 2. 什么是MFC?
•2013-7-31 •12
Windows 程序内部运行机制
Windows API 中消息的定义
操作系统是怎样将感知到的事件传递给应用程序 的呢?这是通过消息机制(Message)来实现的。操作系 统将每个事件都包装成一个称为消息的结构体MSG来 传递给应用程序,参看MSDN。
MSG结构定义如下: typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; •2013-7-31 } MSG;
GetMessage从线程的消息队列中取出消息,取出的消息 保存在事先定义好的消息的结构体对象中。 GetMessage函数取到除WM_QUIT外的消息均返回非零 值,只有在接收到WM_QUIT消息时,才返回0。 什么时候才会收到WM_QUIT呢?(见窗口过程)
•2013-7-31 •22
Windows 程序内部运行机制
MSG msg; while (GetMessage(&msg,NULL,0,0)) //从消息队列获取消息 { TranslateMessage(&msg); //消息解释 DispatchMessage(&msg); //将消息发送到“窗口过程” }
•2013-7-31
•21
Windows 程序内部运行机制
•2013-7-31
•8
第一讲 Windows程序内部运行原理
•2013-7-31
•9
Windows 程序内部运行机制
Windows编程模型
事件驱动编程模型——以消息为基础,事件驱动之
来源于操作系统的消息 WM_PAINT WM_KEYDOWN 消息队列 WinMain
应用程序
窗口
窗口过程
消息响应 消息响应 消息循环 发送消息
•2013-7-31
•6
前言
3. 为什么要使用MFC?
可重用性 封装后使方法和属性更紧密的捆绑 常用的功能自动化,减少编写代码的数量 提供应用程序的框架结构
框架结构提供了抽象功能,它远远超出了Windows API的功能。例如:MFC的文档/视图体系结构在API上 建造了一个功能强大的基础结构,它把程序中数据的图 形表示(或称为视图)与数据本身分开。这种抽象对 API而言完全是陌生的,而且在MFC框架结构之外或类 似的类库中也不存在。
•2013-7-31 •7
关于教材
参考书籍(Windows 编程四大法宝)
《Windows程序设计》(第五版)Charles Petzold著 北京大学出版社( Microsoft Press ) 《Visual C++技术内幕》(第四版)David J. Kruglinski著 清华大学出版社( Microsoft Press ) 《深入浅出MFC》(第二版)侯俊杰著 华中科技大学出版社 《VC深入详解》孙鑫著 电子工业出版社
TranslateMessage
TranslateMessage函数用于将虚拟键消息转换 为字符消息。当我们敲击键盘上的某个字符键时, 系统将产生WM _KEYDOWN和WM_KEYUP消息。这两 个消息的附加参数(wParam和lParam)包含的是虚 拟键代码和扫描码等信息,而我们在程序中往往需 要得到某个字符的ASCII码,TranslateMessage这个 函数就可以将WM_KEYDOWN和WM_KEYUP消息的组合转 换为一条WM_CHAR消息,该消息的WParam附加参数包 含了字符的ASCII码),并将转换后的新消息投递到 调用线程的消息队列中。注意,Translate函数并不 会修改原有的信息,他只是产生新的消息并投递到 消息队列中。
3. 为什么要使用MFC?
•2013-7-31 •2
前言
1. 什么是 Windows API?
从Windows应用程序,操作系统,计算机硬件之间 的相互关系开始说起… 应用程序的机能就是:通知操作系统控制计算机硬 件,执行某个具体的动作,完成特定的功能。 例如:操作系统能够控制声卡发出声音,但它并不 知道应该何时发出何种声音,需要应用程序告诉操作系 统该发出什么样的声音。
•2013-7-31 •5
前言
2. 什么是 MFC?
MFC英文全称为Microsoft Foundation Classes (微 软基础类库),是把Windows API进行封装的类库,它 是一个类的集合,通过覆盖Windows API,为编程提供 了一个面向对象的界面。 MFC使Windows程序员能够利用C++面象对象的特 性进行编程。
未处理的消息
DefWindowProc
•2013-7-31
•16
Windows 程序内部运行机制
1.入口函数WinMain
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow );
•2013-7-31 •23
Windows 程序内部运行机制
DispatchMessage
DispatchMessage分派一个消息到窗口过程。 由窗口过程函数对消息进行处理。 DispatchMessage实际上是将消息回传给操作 系统,再由操作系统调用窗口过程函数对消息进行 处理。
如CreateWindow就是一个API函数,应用程序中调用这个函数, 操作系统就会按照该函数提供的参数信息产生一个相应的窗口。
•2013-7-31 •4
前言
1. 什么是 Windows API?(续)
Windows编程的本质:
利用Windows API 函数编写应用程序,让操作系统完成某种特 定的功能 。
•2013-7-31 •11
Windows 程序内部运行机制
消息响应与窗口过程
如用户在某个程序活动时按了一下键盘, 操作系统马上能够感知到这一事件,并且能够 知道用户按下的是哪一个键,操作系统并不决 定对这一事件如何作出反应,而是将这一事件 转交给应用程序,由应用程序决定如何对这一 事件作出反应。对事件作出反应的过程就是消 息响应,各种消息响应放在一起组成了窗口过 程。
那么,应用程序是如何通知操作系统执行某个功能的呢?
•2013-7-31
•3
前言
1. 什么是 Windows API?(续)
有过编程经验的同学都应该知道,在传统应用程序中 要完成某个功能,都是以函数调用的形式实现的,同样, Windows应用程序也是以函数调用的方式来通知操作系统 执行相应的功能的。 操作系统所能够完成的每一个特殊功能通常都有一个 函数与其对应,也就是说,操作系统把它所能够完成的 功能以函数的形式提供给应用程序使用,应用程序对这 些函数的调用就叫做系统调用,这些函数的集合就是 Windows应用程序编程接口(Application Programming Interface),简称Windows API。
// 当前应用程序实例句炳 // 永远为NULL
// 命令行参数
// 窗口显示时的状态
•2013-7-31
•17
Windows 程序内部运行机制
2. 创建窗口
创建一个完整的窗口需要经过下面四个操作步骤:
Step1: Step2: Step3: Step4: 设计一个窗口类; 注册窗口类; 创建窗口; 显示及更新窗口。
•2013-7-31
•18
Windows 程序内部运行机制
wenku.baidu.com
设计窗口类
typedef struct _WNDCLASS { UINT style; //窗口类样式 WNDPROC lpfnWndProc; //窗口过程函数指针 int cbClsExtra; //窗口类附加内存字节数,通常为0 int cbWndExtra; //窗口附加内存字节数,通常为0 HANDLE hInstance; //应用程序实例句柄 HICON hIcon; //标题栏图标 HCURSOR hCursor; //光标 HBRUSH hbrBackground; //窗口背景颜色 LPCTSTR lpszMenuName; //菜单资源名称 LPCTSTR lpszClassName; //窗口类名称 } WNDCLASS;
GetMessage
BOOL GetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax ); // 消息结构体指针,返回消息信息 // 窗口句柄 ,通常设为NULL // 消息过滤最小值 // 消息过滤最大值
…
WM_LBUTTONDOWN
…
消息响应
实 现 特 定 功 能
未处理的消息
操作系统
DefWindowProc
交还给操作系统
•2013-7-31
•10
Windows 程序内部运行机制
消息、消息队列、消息循环
应用程序开始执行后,系统都会为该程序 创建一个消息队列,这个消息队列用来存放该 程序创建的窗口的消息(消息通常与窗口相 关)。 例如,当我们按下鼠标左键的时候,将会 产生消息,系统会将这个消息放到窗口所属的 应用程序的消息队列中,等待应用程序的处理。 产生的消息都会依次放到消息队列中,而应用 程序则通过一个消息循环不断地从消息队列中 取出消息,并进行响应。
•2013-7-31
•14
Windows 程序内部运行机制
小小知识点——API中对数据类型的宏定义
int x, y; x = 30; y = 30; //x和y既可以用来表示坐标点,也可以用来表示宽度和高度,还可 以用来表示身高和体重。 typedef int WIDTH typedef int HEIGHT WIDTH x; HEIGHT y; //我们从变量的类型上就可以知道x和y是用来表示宽度和高度。
•13
Windows 程序内部运行机制
小小知识点——“句柄”
句柄(HANDLE),资源的标识。 操作系统要管理和操作各种各样的资源,都是通过 句柄来找到对应的资源。按资源的类型,又可将句柄细 分成图标句柄(HICON),光标句柄(HCURSOR), 窗口句柄(HWND),应用程序实例句柄 (HINSTANCE)等等各种类型的句柄。 操作系统给每一个窗口指定的一个唯一的标识号即 窗口句柄。
好处:让数据类型具备语义信息,从变量的类型 就可以区分变量的用途!
•2013-7-31 •15
Windows 程序内部运行机制
编写Windows应用程序的要素
应用程序 WinMain 消息
窗口
窗口过程
消息响应 消息响应
消息循环 发送消息
…
消息响应
1 2 3 4
入口函数WinMain 创建窗口 消息循环与发送消息 窗口过程与消息响应
•2013-7-31
•19
Windows 程序内部运行机制
创建窗口
HWND CreateWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam );