
Windows程序设计初步.ppt
58页Windows 程序设计初步程序设计初步一一 . Windows 系统的特征系统的特征n 标准的用户界面标准的用户界面n 多任务多任务n 设备独立性设备独立性n 动态链接动态链接n 强大的内存管理强大的内存管理二二 . 基本术语基本术语u窗口窗口 (window) 由句柄唯一标识由句柄唯一标识u对话框对话框 (Dialog) 人机交互人机交互u图标图标 (Icon) 代表某项操作或程序的图符代表某项操作或程序的图符u位图位图 (Bitmap) 用位模式形成的图像用位模式形成的图像u菜单菜单 (( Menu) 命令命令u工具栏工具栏 (ToolBar) 常用的菜单项常用的菜单项 u状态栏状态栏 (StateBar) 操作状态或操作提示操作状态或操作提示二二 . 基本术语基本术语 (续续 )句柄句柄 : 用来标识资源的用来标识资源的 32位无符号整数位无符号整数rHANDLE 一般句柄一般句柄rHINSTANCE 实例句柄实例句柄rHWND 窗口句柄窗口句柄rHMENU 菜单句柄菜单句柄rHICON 图标句柄图标句柄rHCURSOR 光标句柄光标句柄rHBITMAP 位图句柄位图句柄三三 . Windows 编程的特点编程的特点1. 消息驱动体系消息驱动体系DOS 编程方式属过程驱动。
编程方式属过程驱动Windows 编程方式属消息驱动编程方式属消息驱动(程序的工作是产生消息,传(程序的工作是产生消息,传递消息和处理消息)递消息和处理消息)过程 1开始过程 2...过程 n结束过程驱动编程模型过程驱动编程模型消息消息处理处理事件 1事件 2事件 3…...事件 n开始开始结束结束事件驱动编程模型事件驱动编程模型事件事件事件是对计算机操作的动作事件是对计算机操作的动作 每个事件对应一个消息,即每个事件对应一个消息,即每个事件发生的效果是产生消每个事件发生的效果是产生消息消息消息l消息的功能:消息的功能:–(1)帮助帮助 Windows 实现多任务实现多任务–(2)通知应用程序某一事件已经通知应用程序某一事件已经发生,各应用程序给予响应发生,各应用程序给予响应l消息的表示消息的表示消息本身内容消息本身内容UINT message 32位无符号整数位无符号整数附加信息附加信息WPARAM wParamLPARAM lParaml消息的定义消息的定义typedef struct tagMSG {HWND hwnd; //接收窗口接收窗口UINT message; //消息标识消息标识WPARAM wParam; //附加附加LPARAM lParam; //附加附加DWORD time; // 入队时间入队时间POINT pt; //光标位置光标位置} MSG; //…\ vc\include\wtypes.hl消息的种类消息的种类 … vc\include\winuser.hl 标准标准 Windows 消息消息–除除 WM_COMMAND 外,所有以外,所有以 WM_ 为前缀的消息,由窗口和视图处理。
为前缀的消息,由窗口和视图处理l 控制消息控制消息–由控件和子窗口发给父窗口的消息由控件和子窗口发给父窗口的消息l 命令消息命令消息–来自用户接口对象如:菜单、工具来自用户接口对象如:菜单、工具条和加速键等条和加速键等l 标准的 Windows消息可以分为三类,即键盘消息、鼠标消息和窗口消息下面分别加以说明l 键盘消息l 当键盘的某个键被按下时,将产生 WM_CHAR消息,这个消息带有字符代码值、重复次数和先前状态码三个参数 WM_CHAR消息的处理函数为 OnChar( ), 此函数的原型为:l afx_msg void Onchar(UINT nChar,UINT nRepCnt,UINT nFlags);l 其中: nChar是所按键的字符代码值;l nRepCnt是重复的次数,它表示用户按键时重复击键的次数;l nFlags表示扫描码、先前键状态和键转换状态等,其参数值功能描述见表 4.1所示 位 含 义0~ 15 指明键重复按下的次数16~ 23 指定扫描码,依赖于具体厂家的按键值24 如果同时按下扩展键(如功能键 Alt、 Ctrl), 则置为 1,否则置为 025~ 28 由 Windows内部使用29 若同时按下了 Alt键,则置为 1,否则置为 030 指明先前键状态。
若消息发出前键是按下的,则置为 1,否则置为 031 指明键转换状态若按键已松开,则置为 1,否则置为 0表 1 nFlags参数值功能描述 l 鼠标消息l 在 Windows中处理鼠标的操作基本上有三种:• 单击 (Click) 2. 双击( Double Click) 3.拖动( Drag)• 所有这些鼠标的操作,都会产生相应的消息鼠标移动时产生 WM_MOUSEMOVE消息,鼠标左键按下时产生 WM_LBUTTONDOWN消息,鼠标右键按下时产生WM_RBUTTONDOWN消息,鼠标左键双击时产生WM_LBOTTONDBLCLK消息等等l 所有这些鼠标消息的处理函数都有相似的原型,它们都有两个参数我们以处理鼠标左键按下的消息 函数 OnLButtonDown( )为例来进行说明此函数的原型如下:l afx_msg void OnLButtonDown(UINT nFlags,Cpoint point);l 其中:参数 point是鼠标事件发生时鼠标光标所在的位置,它是相对于窗口左上角的水平坐标和垂直坐标而言的。
l 参数 nFlag指明鼠标按钮的状态以及鼠标事件发生时键盘上某些键的状态,每一状态都可以由 nFlag的一位来表示我们可以从表 4.2中所列的位屏蔽中得到每一位l 4.2 nFlags参数每位的含义l 其中, MK_CONTROL、 MK_LBUTTON、 MK_MBUTTON、MK_MBUTTON、 MK_RBUTTON和 MK_SHIFT都是预定义的宏位屏蔽 含 义MK_CONTROL Ctrl键按下时设置MK_LBUTTON 鼠标左键按下时设置MK_MBUTTON 鼠标中间键按下时设置MK_RBUTTON 鼠标右键按下时设置MK_SHIFT Shift键按下时设置l 窗口消息l 所有窗口的变化,包括窗口内容重绘 WM_PAINT、 窗口最大化 WM_MAXIMIZE、 窗口最小化WM_MINIMIZE、 窗口重定义大小 WM_RESIZE、 窗口滚动 WM_HSCROLL、 WM_VSCROLL、 窗口定时WM_TIMER等消息所带参数各不相同l 在这里我们来详细讨论一下 WM_PAINT消息当调用成员函数 UpdateWindow( )或 RedrawWindow( )要求重新绘制窗口内容时,应用程序将收到WM_PAINT消息。
当窗口最小化后再还原或被其他窗口遮盖后又重新显示时,则当前窗口中的内容必须重新绘制,消息 WM_PAINT就是为实现这个功能的l l 当 向 Windows应用程序发送 WM_PAINT消息,应用程序检索到此消息后,就重新显示窗口中的内容WM_PAINT消息的处理函数为 OnPaint( )l 函数原型为:l afx_msg void OnPaint( ); l 如果想详细了解所有的标准的 Windows消息,可以参阅 Visual C++ 6.0联机帮助中的有关内容l 4.4.2 控件消息l 控件是一个小的子窗口,属于其他窗口(如对话框等),能够接受操作并象父窗口发送消息常见的控件有按钮、列表框、编辑框、复合框、滚动条等l 在 Visual C++ 6.0中,对控件的操作都是通过生成相应的控件类来进行这些控件类仅能发送少量特定的消息,这些消息就叫做控件消息发送控件消息的控件 在Visual C++中l 使用唯一 ID号来进行标识,使用控件类来操纵l 控件消息分为两类:l 1. 从控件传给消息,通常这类消息的前缀的最后一个字符为 N;l 2. 由系统发送给控件的消息,这类消息的前缀的最后一个字符为 M。
l 例如,当用户对编辑框中的文本进行修改时,编辑框将发送给父窗口一条包含控件通知码 EN_CHANGE的 WM_COMMAND消息窗口的消息处理函数将以某种适当的方式对通知消息作出响应,如检索编辑框中的文本l 与其他标准的 Windows消息一样,控件消息也是由窗口对象和视图对象进行处理l 命令消息l 命令消息主要包括由用户界面对象发送的M_COMMAND消息,用户界面对象是指菜单、工具栏、快捷键等它和控件消息的区别在于:控件消息只能由特定控件向 Windows系统传送,而命令消息是由用户界面发送的,它可以被更多的对象处理在文档对象、视图对象、窗体对象、控件对象中都能处理这种消息l 1. 用户界面对象l 菜单、工具栏、快捷键等都是可以产生命令的用户界面对象每个这样的对象都分配了一个 ID号,通过给对象和命令分配同一个 ID号,将用户界面对象和命令联系在一起例如,选择程序中的 【 文件 】 菜单下的 【 打开 】 菜单项,则产生一条 ID_FILE_OPEN命令,然后通过消息映射调用函数 OnFileOpen() 来进行处理l 2. 命令 IDl 在 MFC编程中,命令完全由命令 ID来进行描述,命令 ID分配给产生此命令的用户界面对象。
通常情况下,命令 ID是由它所表示的用户界面对象的功能来命名的MFC预定义了一些命令 ID,如 ID_EDIT_CUT、ID_FILE_SAVE 等,而其他命令 ID则要由编程人员自己定义l 3. 命令目标l 当用户界面对象被单击后,将调用处理函数来执行所产生的命令 Windows把非命令消息的消息直接发送给窗口,窗口中用于处理这些消息的处理函数将被调用而对于命令消息,将把命令发送给多个目标,也就是命令目标,其中通常有一个要调用此命令的处理函数l消息的产生消息的产生q 用户产生消息用户产生消息q Windows 本身产生消息本身产生消息q 应用程序本身产生消息应用程序本身产生消息q 其他应用程序产生消息其他应用程序产生消息l消息的传递消息的传递Windows 系统有一个存放消息的队列,每系统有一个存放消息的队列,每个应用程序也有一个消息队列个应用程序也有一个消息队列 Windows系统先将收到的消息存放在系统队列中;系统先将收到的消息存放在系统队列中;然后再分发到相应的应用程序队列中应然后再分发到相应的应用程序队列中应用程序则从自身的队列中获取消息并进行用程序则从自身的队列中获取消息并进行处理。
处理事件 事件 事件系统消息队列应用程序队列 应用程序队列 应用程序队列应用程。
