Windows程序设计第2章.ppt
- 文档编号:18708690
- 上传时间:2023-10-13
- 格式:PPT
- 页数:37
- 大小:569.50KB
Windows程序设计第2章.ppt
《Windows程序设计第2章.ppt》由会员分享,可在线阅读,更多相关《Windows程序设计第2章.ppt(37页珍藏版)》请在冰点文库上搜索。
第二章基于API的Windows编程,内容提要,2.1Win32API基础2.2Win32API应用程序框架2.3Windows程序模型2.4句柄及其类型2.5消息及其在编程中的应用2.6用API编写Windows应用程序举例,2.1Win32API基础,2.1.1什么是APIAPI(ApplicationProgrammingInterface),即应用编程接口,是Windows操作系统和Windows应用程序间的标准程序接口。
API为应用程序提供了系统各种特殊函数及数据结构定义,Windows应用程序可以利用标准API函数来调用系统功能。
从Windows1.0以来,系统就提供了API函数的调用,随着系统升级,API函数在不断扩充,目前已有几千个,并且向后兼容。
Windows1.0到Windows3.1,API是基于16位体系结构的,称为Win16API。
WindowsNT到WindowsXP32-BitEdition、WindowsVistax32Edition,API是基于32位体系结构的,称为Win32API。
WindowsSever2003、WindowsXP64-BitEdition和WindowsVistax64Edition,API是基于64位体系结构的,称为Win64API,2.1Win32API基础,2.1.2API函数类型根据WindowsAPI函数完成的功能,可将其分为三类:
窗口管理函数,它主要实现窗口的创建、移动和修改功能;图形设备(GDI)函数,它主要实现与设备无关的图形操作功能;系统服务函数,它主要实现与操作系统有关的多种功能。
2.1Win32API基础,2.1.3为什么要学习API目前有许多编写Windows应用的开发工具,为什么还要学习基于API的Windows编程方法呢?
原因如下:
1.通过API编程,可以对Windows系统内部运行机制有更深入了解;2.使用C语言和API编写的程序,可执行代码量小,仅依赖于WinDLL;3.API是各种现有开发工具的基础。
几乎所有基于Windows平台的开发工具都用自己的语言对重要的API函数进行了重新编写和封装,以提供对这一功能的支持。
因此学习API,有助于在其他开发工具中更好地理解和利用API函数。
4.API函数直接针对Windows的底层,对于开发工具中不具备的功能,可以通过直接调用API函数来实现。
2.2Win32API应用程序框架,2.2.1实例利用API函数编写一个Windows应用程序。
要求:
窗口显示字符串“这是一个基于API的Windows应用程序!
”。
窗口的标题栏显示“窗口示例程序”当按下键盘的任意一个键时,窗口显示的文本领色将随机地发生改变。
2.2Win32API应用程序框架,2.2.2程序源代码#includeLRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);/窗口函数说明/-以下初始化窗口类-intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInst,LPSTRlpszCmdLine,intnCmdshow)/WinMain函数说明HWNDhwnd;MSGMsg;WNDCLASSwndclass;charlpszClassName=窗口示例;/窗口类名charlpszTitle=窗口示例程序;/窗口标题名/-窗口类的定义-wndclass.style=0;/窗口类型为默认类型wndclass.lpfnWndProc=WndProc;/窗口处理函数为WndProcwndclass.cbClsExtra=0;/窗口类无扩展wndclass.cbWndExtra=0;/窗口实例无扩展wndclass.hInstance=hInstance;/当前实例句柄wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);/使用用默认图标wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);/窗口采用箭头光标wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);/窗口背景为白色wndclass.lpszMenuName=NULL;/窗口中无菜单wndclass.lpszClassName=lpszClassName;/窗口类名为“窗口示例”,1,2.2Win32API应用程序框架,/-以下进行窗口类的注册-if(!
RegisterClass(/程序终止时将信息返回系统,2,2.2Win32API应用程序框架,/-窗口函数-LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)RECTrect;HDChdc;PAINTSTRUCTps;staticintuRed=0,uGreen=0,uBlue=0;LPCTSTRstr=这是一个基于API的Windows应用程序;switch(message)caseWM_PAINT:
hdc=BeginPaint(hwnd,3,2.2Win32API应用程序框架,2.2.3代码分析程序由三部分组成:
头文件、函数WinMain()和WndProc()。
1.头文件:
#include2.WinMain()函数是所有Windows应用程序的入口,类似C语言中的main函数;
(1)WinMain函数实现以下功能:
注册窗口类,建立窗口及执行其他必要的初始化工作;进入消息循环,根据从应用程序消息队列接受的消息,调用相应的处理过程;消息循环是整个程序运行的核心。
当消息循环检索到WM_QUIT消息时终止程序运行。
2.2Win32API应用程序框架,
(2)WinMain函数的组成有三个基本组成部分:
函数说明、初始化和消息循环。
函数说明:
WinMain函数的说明如下:
intWINAPIWinMain(HINSTANCEhInstance,/应用程序当前实例句柄HINSTANCEhPrevInst,/其他实例句柄,为兼容早期LPSTRlpszCmdLine,/指向程序命令行参数的指针intnCmdShow/程序执行时窗口显示方式(最大、正常、最小、隐藏等)/WINAPI是个宏,一般代表_stdcall调用约定,不写的话编译器缺省认为_cdecl/_stdcall调用约定:
压栈顺序为从右至左,清栈由被调用函数负责。
/_cdecl调用约定:
压栈顺序为从右至左,清栈由函数调用者负责。
2.2Win32API应用程序框架,初始化初始化包括窗口类的定义、注册、创建窗口实例和显示窗口四部分。
窗口类定义:
通过给窗口类数据结构WNDCLASS赋值完成;注册窗口:
RegisterClass(&wndclass);创建窗口实例:
由函数CreateWindow()实现;窗口类的显示:
由ShowWindow()和UpdateWindow()函数实现。
2.2Win32API应用程序框架,消息循环Windows应用程序的运行以消息为核心。
Windows将产生的消息放入应用程序的消息队列中,而应用程序WinMain函数的消息循环提取队列中的消息,并将其传递给窗口函数的相应过程处理。
消息循环的常见格式如下:
MSGMsg;while(GetMessage(Msg,NULL,0,0)TranslateMessage(Msg);DispatchMessage(Msg);,2.2Win32API应用程序框架,3窗口消息处理函数WndProc()窗口函数的主体是消息处理语句,由一系列case语句组成。
程序员只需根据窗口可能收到的消息,在case语句中编写相应的处理程序段即可。
2.3Windows程序模型,Windows应用程序采用了基于事件驱动的程序模型。
过程驱动模型,事件驱动模型,Windows应用程序流程,Windows的消息机制,2.4句柄及其类型,句柄:
句柄(handle)是Windows编程的基础,它是一个4字节长的整数值,用于标识应用程序中不同的对象和同类对象中不同的实例,诸如一个窗口、按钮、图标、滚动条、输出设备、控件或文件等对象,都需要一个唯一的句柄来标识,应用程序通过句柄来访问相应的对象信息。
句柄的类型:
在Windows应用程序中,句柄的使用是很频繁的,常用句柄类型如下表所示。
2.5消息及其在编程中的应用,事件驱动围绕着消息的产生与处理展开,一条消息是关于发生的事件的消息。
事件驱动是靠消息循环机制来实现的。
1.消息:
是一种报告有关事件发生的通知。
在Windows中消息用一个数据结构来表示。
2.消息的种类:
(1)输入消息:
包括键盘和鼠标的输入。
(2)控制消息:
用来与Windows的控制对象,如列表框、按钮、检查框等进行双向通信。
(3)系统消息:
对程序化的事件或系统时钟中断作出反应。
(4)用户消息:
这是程序员自己定义并在应用程序中主动发出的,一般由应用程序的某一部分内部处理。
2.5消息及其在编程中的应用,3.消息的组成Windows中消息主要由三部分组成:
消息号、字参数和长字参数。
(1)消息号由事先定义好的消息名标识;
(2)字参数(wParam)和长字参数(lParam)用于提供消息的附加信息,附加信息的含义与具体消息号的值有关。
在Windows中消息往往用一个结构体MSG来表示,结构体MSG的定义如下:
typedefstructtagMSGHWNDhwnd;/获取消息的窗口句柄UINTmessage;/消息号,每个Windows消息都有一个消息号WPARAMwParam;/提供消息的附加信息LPARAMlParam;/提供消息的附加信息DWORDtime;/指定消息发送至队列的时间POINTpt;/指定消息发送时,屏幕光标的位置MSG;,2.5消息及其在编程中的应用,4.Windows常用消息的宏定义为了便于识别消息,用事先定义的宏来表示消息,不同类属的消息具有不同的宏前缀。
宏前缀:
BM按钮控制消息(ButtonMessage);如BM_CLICKCB组合框控制消息(CombineBox);如CB_SHOWDROPDOWNDM默认下压式按钮控制消息(DefaultMessage);如DM_REPOSITIONEM编辑控制消息(EditMessage);如EM_GETLINELB列表框控制消息(ListBox);如LB_GETCOUNTSBM滚动条控制消息(ScrollBarMessage);如SBM_SETRANGEWM窗口消息(WindowMessage)。
如WM_CREATE,2.6用API编写Windows应用程序举例,例一:
如2.2.1利用API函数编写一个Windows应用程序。
要求:
窗口的第一行上显示“这是一个基于API的Windows应用程序!
”。
窗口的标题栏显示“窗口示例程序”当按下键盘的任意一个键时,窗口显示的文本领色将随机地发生改变。
2.6用API编写Windows应用程序举例,关于WM_PAINT消息Windows在两种情况下会向窗口发送WM_PAINT消息1.首次创建窗口后,Windows将发送WM_PAINT消息到窗口过程,实现窗口客户区的绘制。
2.在特定的窗口被其它窗口覆盖的情况下,上面的窗口移动或关闭时,下面被覆盖的窗口就会出现“空洞”。
这个“空洞”是一块无效的用户区域。
像改变窗口尺寸后,客户区的部分内容被遮盖,窗口最小化、客户区的滚动等都会造成无效的客户区域,为重新显示无效客户区域,Windows会发送WM_PAINT消息到窗口过程,以重新绘制下面的窗口。
除此之外,InvalidateRect,InvalidateRgn也会产生WM_PAINT消息,用于重绘窗口。
2.6用API编写Windows应用程序举例,InvalidateRect说明:
重画一个指定矩形范围内的客户区原型:
BOOLInvalidateRect(HWNDhWnd,CONSTRECT*lpRect,BOOLbErase);参数:
hWnd窗口句柄lpRect指向表示矩形范围的结构RECT的指针bErase是否擦除背景后重绘。
TRUE表示擦除背景后重绘;FALSE表示不擦除背景直接重绘,2.6用API编写Windows应用程序举例,例二:
在例一基础上,要求对字体、字号进行设置。
Windows共支持两大类字体:
逻辑字体和设备字体。
设备字体是输出设备所固有的;逻辑字体也称为GDI字体,可以创建并选入设备描述表。
Windows2000支持三种类型逻辑字体:
光栅字体:
也叫位图字体,不能旋转或缩放,支持该字体是因为许多老的程序仍然依赖这些字体。
矢量字体:
是从数学模型生成的,字符用线段绘制,可以缩放任意比例。
TrueType字体:
是由直线和曲线命令生成的轮廓字体,两者都可以缩放和旋转。
通过它们可能用任意字体尺寸在所有输出设备上输出优美的文字。
2.6用API编写Windows应用程序举例,WindowsAPI中设置字体有两种常用的逻辑字体创建函数:
CreateFont和CreateFontIndirectCreateFont说明:
该函数用特定的格式创建逻辑字体HFONTCreateFont(intnHeight,/字体高度intnWidth,/字符的平均宽度intnEscapement,/垂直旋转角度intnOrientation,/水平旋转角度intfnWeigth,/字体的磅数,DWORDfdwItalic,/是否倾斜DWORDfdwUnderline,/是否有下划线DWORDfdwStrikeOut,/是否加粗DWORDfdwCharSet,/指定字符所属的族DWORDfdwOutPutPrecision,/字体的输出精度DWORDfdwClipPrecision,/字体的剪切精度DWORDfdwQuality,/字体的输出质量DWORDfdwPitchAndFamily,/字体的斜度和家族LPCTSTRlpszFace);/字体名称,2.6用API编写Windows应用程序举例,CreateFontIndirect本函数通过以一个结构为参数,创建一个逻辑字体原型:
HFONTCreateFontIndirect(CONSTLOGFON*lplf);参数:
lplf是一个指向结构LOGFONT的指针。
typedefstructtagLOGFONTLONGlfHeight;LONGlfWidth;LONGlfEscapement;LONGlfOrientation;LONGlfWeight;BYTElfItalic;BYTElfUnderline;BYTElfStrikeOut;BYTElfCharSet;BYTElfOutPrecision;BYTElfClipPrecision;BYTElfQuality;BYTElfPitchAndFamily;TCHARlfFaceNameLF_FACESIZE;LOGFONT,*PLOGFONT;,2.6用API编写Windows应用程序举例,作为例二,需要对例一中函数WinProc()的代码做相应修改,我们在这里采用CreateFontIndirect函数来创建字体。
首先,增加如下变量的定义LOGFONTLogFont;HFONThfont1,oldfont;,2.6用API编写Windows应用程序举例,对caseWM_PAINT:
后的代码进行修改caseWM_PAINT:
hdc=BeginPaint(hwnd,2.6用API编写Windows应用程序举例,LogFont.lfCharSet=GB2312_CHARSET;lstrcpy(LogFont.lfFaceName,隶书);/对变量LogFont进行初始化hfont1=CreateFontIndirect(,2.6用API编写Windows应用程序举例,例三文本的格式化输出WindowsAPI中有三类函数可以实现文本的格式化输出:
获取和设置设备描述表的文本格式化属性的函数,获取字体宽度信息的函数:
获取字符串宽度和高度信息的函数:
在编写应用程序时,用得最多的是第一类函数。
下面做一介绍:
2.6用API编写Windows应用程序举例,1.文本对齐函数
(1)SetTextAlign设置文本基于输出参考点的对齐方式原型:
UINTSetTextAlign(HDChdc,UINTfMode);参数:
hdc设备环境句柄,用于获得文本输出的设备或环境;fMode文本字符串与输入参考点的对齐方式的标识符,在输出文本时,可以用“|”连接多个标识符。
(2)GetTextAlign获取文本基于输出参考点的对齐方式原型:
UINTGetTextAlign(HDChdc);参数hdc:
设备环境句柄,用于获得文本输山的设备或环境。
2.6用API编写Windows应用程序举例,2.调整字符间距函数
(1)SetTextCharacterExtra用于在文本输出时调整字符的输出间距,默认的字符间距为零。
原型:
SetTextCharacterExtra(HDChdc,intnCharExtra);参数:
nCharExtra指定额外空间的大小。
(2)GetTextCharacterExtra获取当前字符间距原型:
intGetTextCharacterExtra(HDChdc,)返回值:
当前字符间空间的大小。
2.6用API编写Windows应用程序举例,3.文本和背景颜色函数
(1)SetTextColor改变指定环境中的文本颜色。
原型:
COLORREFSetTextColor(HDChdc,COLORREFcrColor);参数:
crColor指定的文本颜色。
(2)SetBkColor改变指定环境中的背景颜色。
原型:
COLORREFSetBkColor(HDChdc,COLORREFcrColor);参数:
crColor指定的背景颜色。
(3)GetTextColor获取指定环境中的文本颜色。
原型:
COLORREFGetTextColor(HDChdc);返回值:
当前文本颜色。
(4)GetBkColor获取指定环境中的背景颜色。
原型:
COLORREFGetBkColor(HDChdc);返回值:
当前背景颜色。
2.6用API编写Windows应用程序举例,4.段落对齐函数
(1)GetTextExtentPoint32计算指定字符串的长度和宽度原型BOOLGetTextExtentPoint32(HDChdc,LPCSTRlpString,intcbString,LPSIZElpSize);参数:
1pString文本字符串。
cbString宁符串的长度,lpSize返回字符串的长度和宽度的SIZE结构指针。
(2)SetTextJustification指定在字符串中,空格应占的字符数原型SetTextJustification(HDChdc,intnBreakExtra,intnBreakCount);参数nBreakExtra字符串中空格所占的长度。
nBreakCount空格的数目。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Windows 程序设计