Windows编程基础.ppt_第1页
Windows编程基础.ppt_第2页
Windows编程基础.ppt_第3页
Windows编程基础.ppt_第4页
Windows编程基础.ppt_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二章 Windows编程基础 2.1 关于Windows系统 Microsoft公司的Windows系统是为PC级 计算机开发的图形界面操作系统。它是一 个多任务的操作系统,该系统为应用程序 提供了统一的窗口和菜单界面。由于 Windows的程序的窗口和菜单界面是统一 的,所以对用户来说,Windows比传统的 命令行式的系统更易于学习和使用。 Windows系统的主要有点是可以同时运行 几个应用程序。 1 Windows系统的历史 1983年 推出了Windows1.0版本; 1985年 Windows 1.1正式推出; 1987年10月 推出Windows 2.0; 1992年 Windows 3.1发布; 1993年11月 Windows 3.11发布; 1994年 Windows 3.2发布;。 1995年8月24日 Windows 95发布; 1996年8月24日 Windows NT4.0发布; 1998年6月25日 Windows98发布; 2000年9月14日 Windows Me发布; 2000年12月19日 Windows 2000; 2001年10月25日 Windows XP发布; 2003年4月底 Windows 2003发布; 2006年9月 Windows Vista发布。 2Windows的普及性 1)Windows系统为用户提供的方便 2)Windows系统为程序员提供的方便 3窗口的标准组成部分 1)边框 2)用户区 3)控制菜单(系统菜单) 4)标题栏 5)控制按钮 6)菜单栏 7)滚动条 4 Windows系统函数(API函数 ) 窗口管理函数:实现窗口的建立、显示、 移动和修改功能(帮助文件WINUI.CHM)。 图形设备(GDI)函数:实现与设备无关的图 形图像操作功能(帮助文件GDI.CHM)。 系统服务函数:实现与操作系统有关的操 作(帮助文件WINBASE.CHM)。 5 Windows系统消息 Windows系统应用程序通过Windows系统 消息与其他Windows应用程序或Windows 系统通信。因为Windows应用程序是消息 驱动的(也称作事件驱动),因此了解 Windows的系统消息是非常重要的。 6匈牙利表示法 以小写字母作为变量名的前缀,表示变量 的数据类型;变量名的其余部分作描述该 变量功能之用,每一种功能单词以大写字 母开始,公认的简略语可以作为命名变量 名之用。例如: nCharacterCounter 或 nCharCount 都指示 我们定义了一个整型变量,作为字符计数 。 前缀意义 a Array 数组 bBOOL (int) 布尔值 byUnsigned Char (byte) 无符号8位整数 cChar 字符(8位整数) cb Count of bytes无符号8位整数的计数器 cr Color reference value 颜色引用值 cx Count of x (short) 对象x计数器 dw DWORD (unsigned long) 无符号长整数 fFlags (usually multiple bit values) 标志 位 fn Function 函数 g_ Global 全局变量 h Handle 句柄 前缀意义 iInteger 整数 lLong 长整数 lpLong pointer 长指针 m_Data member of a class 类成员数据 nShort int 短整数 pPointer 指针 sString 子串 szZero terminated String 以零结尾的字串 tmText metric 字体单位(结构TEXTMETRIC) uUnsigned int 无符号整数 ulUnsigned long (ULONG) 无符号长整数 wWORD (unsigned short) 无符号短整数 x,yx, y coordinates (short) 坐标x,y值(短整数 ) 7句柄 在Windows中,对象可以是所有的规范部 件,如窗口、菜单、工具栏、按钮和编辑 框等。当然,我们自己编写的应用程序也 是对象。 Windows怎样访问和控制这些对象呢?所 有这些对象在系统内部都有一个唯一的标 识,该标识是一个32位的指针。Windows 称这个标识为对象的句柄(Handle)。 句柄类型说明 HACCEL 快捷键句柄 HANDLE 通用对象句柄 HBITMAP位图对象句柄 HBRUSH画刷对象句柄 HCURSOR光标对象句柄 HDC 设备环 境对象句柄 HFILE 文件对象句柄 HFONT 字体对象句柄 HGDIOBJ GDI(图形设备接口)对象句柄 HGLOBAL 全局内存块对象句柄 句柄类型说明 HICON 图标对 象句柄 HINSTANCE 应用程序实例对象句柄 HKEY 注册键对象句柄 HLOCAL 局域内存块对象句柄 HMENU 菜单对象句柄 HMODULE 模块对象句柄(加载动态库 ) HPALETTE 调色板对象句柄 HPEN 画笔对象句柄 HRGN 区域对象句柄 HWND 窗口对象句柄 8头文件 Microsoft SDK (Software Development Kit)提供了“Windows.h”等一些列头文件。 这些头文件包含的对API函数原型的说明、 消息常量的定义、结构类型的定义。当我 们使用某些函数、常量或结构体时,可以 通过MSDN查找应该包含的头文件。 9Windows常用的数据类型 为了编程方便,便于记忆,区别于其他系 统。Windows定义了一些数据类型。 Windows的类型C+中的类型说明 BOOL int布尔值 BYTEunsigned char8位无符号整数,0-255 CALLBACK_stdcall标准C调用 CHARchar8位整数,-128127 COLORREF unsigned longRGB颜色值,0x00bbggrr CONST const常量类型 DWORD unsigned long无符号32位整数,0到232-1 FLOAT float32位浮点数,范围1038到10-40,精度是7位 INT int32位平台上32位整数,16位平台上16位整数 LONG long32位整数,-223到223-1 LONGLONG _int6464位整数,-263到263-1 LPARAM long消息附加参数2 LPCOLORREF unsigned long*COLORREF的指针 Windows的类型C+中的类型说明 LPCSTR const char *常量串指针 LPCTSTR const char *可移植常量串指针 LPVOID void far*通用类型指针 LRESULT long消息处理结果(有符号) SHORT short16位整数,-32,768 到 32,767 UINT unsigned int无符号整数 ULONG unsigned long无符号32位整数 ULONGLON unsigned _int64无符号64位整数 USHORT Unsigned short无符号16位整数 VOID void任意类型 WNDPROC long (_stdcall *)(void*, unsigned int, unsigned int, long); 窗口过程指针 WINAPI _stdcall标准C调用 WORDunsigned short无符号16位整数 WPARAMunsigned int消息附加参数1 2.2 Windows程序特性 标准的用户界面窗口 应用程序与硬件无关 消息驱动机制 2.3 窗口程序的组成和功能 Windows窗口应用程序最少应该由两部分 组成,即一个主函数和一个窗口函数。一 个负责建立和显示窗口,并为窗口传递消 息;一个负责处理消息处理和维护窗口 1主函数(入口函数) 同我们前面学习的传统的C程序一样, Windows程序也必须有一个且只能有一个 主函数。所不同的是,以前的C程序的主函 数名是main,并且有几个重载形式。而 Windows程序的主函数名是WinMain,而 且有着严格的唯一的格式。 1)主函数格式 int WINAPI WinMain( HINSTANCE hInstance, / 当前实例句柄 HINSTANCE hPrevInstance, / 前一个实例句柄(16位 ) LPSTR lpCmdLine, / 命令行 int nCmdShow / 显示状态 ); 函数名必须是 WinMain 返回类型是int 参数传递约定是WINAPI(_stdcall) 标准的C约定 参数: hInstance 当前运行程序的句柄; hPrevInstance 前一个程序的句柄,已经淘汰不用了,保 留只是为了兼容; lpCmdLine 命令行参数; nCmdShow 程序开始运行时,窗口的状态(最大化,最小 化)。 2)建立窗口程序,在主函数中必须 做的三件事 在窗口应用程序的主函数中,必须为应用 程序注册窗口类,建立窗口并显示窗,和 建立消息循环。人们也将以上三步称为对 应用程序的初始化,这三步是必不可少的 ,并且要按照严格的顺序和格式执行的。 否则,程序将无法运行或出错。 注册窗口类 第一步:定义一个窗口类结构数据变量 第二步:给相关的注册项赋值 第三步:注册这个窗口类 WNDCLASS wndClass; /-第一步- /-第二步- wndClass.style = CS_HREDRAW | CS_VREDRAW; wndClass.lpfnWndProc = WndProc; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hInstance; wndClass.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_FIRST); wndClass.hCursor= LoadCursor(NULL, IDC_ARROW); wndClass.hbrBackground= (HBRUSH)(COLOR_WINDOW+1); wndClass.lpszMenuName= (LPCSTR)IDC_FIRST; wndClass.lpszClassName= szWindowClass; /_第二步_ RegisterClass( /-第三步- 结构WNDCLASS Windows 为了控制窗口,每一个窗口程序运 行时都必须注册一个代表本窗口的窗口类 ,用以记录窗口应用程序的基本信息。 这个窗口类是一个结构类型的数据,是专门 用来承载窗口基本信息的。 结构WNDCLASS typedef struct _WNDCLASS UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HANDLE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; WNDCLASS; 函数RegisterClass ATOM RegisterClass( CONST WNDCLASS *lpWndClass/ 指向窗口类结构数据的指针 ); 函数的返回类型是ATOM,这是一个Windows定义的数据类型, 等价于C语言中的unsigned short。如果注册成功,将返回一 个唯一的类标识值。否则返回0。 注意 随着Windows版本的不断更新,与之相应 的API也在不断的扩展,现在普遍使用的窗 口类结构和注册函数,是带Ex后缀的扩展 版 建立和显示窗口 HWND hWnd; / 窗口句柄 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,0, CW_USEDEFAULT,0, NULL,NULL, hInstance,NULL );/建立窗口 ShowWindow(hWnd, nCmdShow); / 显示窗口 函数CreateWindow HWND CreateWindow( LPCTSTR lpClassName, / 已经注册了的窗口类的名称 LPCTSTR lpWindowName, / 窗口名称,标题栏上显示的 DWORD dwStyle, / 窗口的样式 int x, / 窗口左上角的横坐标 int y, / 窗口左上角的纵坐标 int nWidth, / 窗口的宽度 int nHeight, / 窗口的高度 HWND hWndParent, / 父窗口 HMENU hMenu, / 菜单或子窗口标识 HANDLE hInstance, / 模块实例句柄 LPVOID lpParam / 创建窗口时的参数 ); 函数ShowWindow BOOL ShowWindow( HWND hWnd, / 窗口句柄 int nCmdShow / 执行显示的状态 ); 建立消息循环 Windows窗口应用程序是由消息驱动的。在应用程序 的主函数中需要一个消息循环,负责接收、转换 和分派消息。这是主函数需要做的最后一项工作 。代码如下: MSG msg; while(GetMessage( DispatchMessage( 结构MSG typedef struct tagMSG / msg HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; MSG; 结构POINT typedef struct tagPOINT LONG x; LONG y; POINT; 函数GetMessage BOOL GetMessage( LPMSG lpMsg, / 接收消息的变量地址 HWND hWnd, / 接收消息的窗口 UINT wMsgFilterMin, / 消息的下限 UINT wMsgFilterMax / 消息的上限 ); GetMessage函数负责将消息接收。当接收到的消息是 WM_QUIT时,返回0,结束消息循环。 函数TranslateMessage BOOL TranslateMessage( CONST MSG *lpMsg /消息结构变量的地址 ); 说明:负责将虚拟键消息转换成字符消息。 值得注意的是该函数并不是修改参数lpMsg 所指定的消息,而是视情况产生一个新的消 息。 函数DispatchMessage LONG DispatchMessage( CONST MSG *lpmsg /消息结构变量的地 址 ); 说明:该函数负责进一步将消息传递的 指定窗口(子窗口或对象)的窗口函数。 2窗口函数(窗口过程函数) 程序第二个基本部分就是窗口函数,其 作用就是负责接收和处理来自消息循环的 消息。该函数是在窗口类注册时,通过参 数lpfnWndProc和窗口关联的。 这个函数同主函数一样有着严格的格式 ,唯一可以变动的是他的函数名。在一个 Windows应用程序中可能有若干个窗口,每 个窗口都有自己的窗口函数,所用名称还 是必须分开的。其他部分最好还是严格按 Windows的要求写。 窗口函数的格式 LRESULT CALLBACK WindowProc( HWND hwnd, / 窗口句柄 UINT uMsg, / 消息标识 WPARAM wParam, / 附加参数1 LPARAM lParam / 附加参数2 ); 函数返回值取决于所处理的消息。 窗口函数将消息通过参数uMsg带入,我们 的任务就是处理这些消息。用switch-case 分支结构分拣这些消息,挑选出我们需要 处理的消息,写出相应的处理代码,其余 的交给函数DefWindowProc 。 函数DefWindowProc LRESULT DefWindowProc( HWND hwnd, / 窗口句柄 UINT uMsg, / 消息标识 WPARAM wParam, / 附加参数1 LPARAM lParam / 附加参数2 ); 处理消息的原则是凡是窗口函数不处理或处理 不了的消息,都必须传送到DefWindowProc, 其返回值也是取决于所处理的消息。 消息循环中函数DispatchMessage的返回值, 就是来自窗口函数的返回值。 2.4 消息机制 在Windows操作系统中,无论是系统产生的 动作或是用户在运行应用程序中发出的操 作动作都称为事件(Events),而消息( Message)用于描述某个事件发生的信息。 消息是对事件规格化的描述。 1.事件 Windows是事件驱动的系统,当我们按下一个 键、移动鼠标或点击鼠标时,计算机硬件 便通知Windows系统发生了一个事件,以及 事件的种类、来源,目标、时间、地点等 等。 事件通过一下三种途径产生: 通过输入输出设备,如键盘、鼠标、硬盘的设 备。 通过屏幕上可视化的对象,如菜单、工具栏按 钮、滚动条和对话框上的控件。 Windows内部产生的事件。 2.消息 当Windows获悉一个事件后,它编写一条消息 ,将事件的相关信息放进一个数据结构当 中,这个结构就是一个规格化的消息。然 后将该消息放入消息队列中,等待进一步 的发送和处理。 常用的消息 消息含义 WM_PAINT 重绘窗口 WM_COMMAND命令,含义在附加信息中定义 WM_QUIT 程序结束 WM_LBUTTONDOWN鼠标左键按下 WM_LBUTTONUP 鼠标左键弹起 WM_MOUSEMOVE 鼠标移动 WM_MOVE 窗口移动 WM_SIZE窗口尺寸改变 Windows中消息范围的划分 范围含义 0 到 WM_USER 1留作系统使用 WM_USER 到 0x7FFF窗口类使用(我们编程时自定义消息) WM_APP 到 0xBFFF应用程序使用 0xC000到 0xFFFF应用程序中用于消息交换时,对串的定 义 0xFFFF之后系统保留 3.消息响应机制 4消息处理 LRESULT CALLBACK WindowProc( HWND hwnd, / handle to window UINT uMsg, / message identifier WPARAM wParam, / first message parameter LPARAM lParam / second message parameter ); INT_PTR CALLBACK DialogProc( HWND hwndDlg, / handle to dialog box UINT uMsg, / message WPARAM wParam, / first message parameter LPARAM lParam / second message parameter ); Windows系统中的消息的类型 Windows系统中的消息主要有2种类型: 标准Windows消息 来自子窗口或子对象的消息命令消息。 5标准Windows消息 负责窗口和设备建立、管理的消息都属 于标准Windows消息。常用的标准消息有 窗口消息; 系统命令消息; 绘图绘画消息; 键盘消息; 鼠标消息。 1)窗口消息 窗口消息是用来构建和管理窗口的。 2)系统命令消息 用户选定窗口系统菜单,最大化、最小化、还原 、关闭按钮时,窗口会收到系统命令消息。 消息名称: WM_SYSCOMMAND。 wParam : 系统命令类型。 lParam : 当鼠标选择系统菜单命令时,低字 包含光标在屏幕上的水平坐标,高字包含光标 在屏幕上的垂直坐标,不使用鼠标时或略。 系统命令类型 值含义 SC_CLOSE 关闭窗口 SC_HOTKEY激活与热键有关的窗口 SC_HSCROLL水平滚动 SC_KEYMENU通过键盘获 取菜单 SC_MAXIMIZE 窗口最大化 SC_MINIMIZE 窗口最小化 SC_MONITORPOWER屏幕电源状态。lParam = 1 节能方式,=2 关闭电源 SC_MOUSEMENU 通过鼠标获取菜单 系统命令类型 值含义 SC_MOVE 移动窗口 SC_NEXTWINDOW 进入下一个窗口 SC_PREVWINDOW 进入上一个窗口 SC_RESTORE 还原窗口 SC_SCREENSAVE 运行屏幕保护程序 SC_SIZE 确定窗口大小 SC_TASKLIST 激活开始菜单 SC_VSCROLL 垂直滚动 3)绘图绘画消息 窗口数据更新,窗口背景重绘,图标绘制 等和窗口中图形图像有关的操作,都需要 绘图绘画消息。 绘图绘画消息 消息名称发生时机(或 使窗口发生 ) 参数和返回值 WM_DISPLAYCHANGE屏幕分辨率改 变时,通知 所有的窗口 。 wParam 新的图像深度, 每个象素的位数。 lParam 低位字指明水平 的分辨率,高位字指 明垂直分辨率。 WM_ERASEBKGND当需要绘制窗 口背景时 wParam 设备环 境句柄 WM_ICONERASEBKGND当需要绘制最 小化的背景 wParam 设备环 境句柄 WM_NCPAINT当需要绘制窗 口框架时 绘图绘画消息 消息名称发生时机(或使 窗口发生) 参数和返回值 WM_PAINT当需要绘制窗口 时 WM_PAINTICON当需要绘制最小 化的图标时 WM_PRINTCLIENT 当需要绘制窗口 客户区时 wParam 设备环 境句柄 WM_SETREDRAW设置或清除重绘 标志 wParam 指明重绘状态 TRUE允许重绘 FALSE不允许重绘 4) 键盘消息 在程序运行过程中,当用户对键盘进行操 作时,会产生对应的消息。系统将把此消 息发送给对应的窗口。 键盘消息 消息名称发生时机(或使窗口 发生) 参数和返回值 WM_CHAR发送WM_KEYDOWN 的同时 wParam 所按键的字符到码值 lParam 32位标志码, WM_DEADCHAR发送WM_KEYUP的同 时 同上 WM_KEYDOWN键盘键 被按下时同WM_CHAR WM_KEYUP键盘 上被按下的键释 放时 同WM_CHAR WM_KILLFOCUS窗口失去键盘 焦点wParam 获得键盘 焦点窗口的 据柄 5)鼠标消息 在应用程序运行过程中,当用户操作鼠标 时,Windows会产生相对应的消息,并将这 些消息发送到对应的窗口。 鼠标消息分两

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论