Delphi直接用WindowsAPI编程讲解_第1页
Delphi直接用WindowsAPI编程讲解_第2页
Delphi直接用WindowsAPI编程讲解_第3页
Delphi直接用WindowsAPI编程讲解_第4页
Delphi直接用WindowsAPI编程讲解_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、Delphi程序员往往习惯了用VCL元件编程,其实Delphi也能进行基于WINDOWS API SDK编程。而且用 Delphi在某些方面效果似乎比用 VisualC+效果还要好。比如本例程,用Delphi 6编译出来只有9216字节(9k)而同样的Visual C+g序却有16896字节(17k)。(此例程是笔者从网上下载的 C+源码例程,其中有c源程序,和编译好的.exe文件。源代码经笔者改写成 Delphi代码。)这证明Delphi编译器的优化效果非常好。API 是(Application Programmi ng In terface)的缩写,意为应用编程界面,它包含了编写Windo

2、ws所有函数、数据类型。VCL就是以它为基础进行 封装的,它是应用程序在 Windows上运行的基础。通过熟悉使用 WINDOVAPI SDK直接编制WINDOWS序,程序员将对 WINDOWS执行机制有更深入的了解, 从而编写出更咼效、实用的程序。下面是我们用API函数建立的第一个程序:1: program HELLOWIN;2:3: uses4:win dows, Messages ,mmsystem;5:6:7:8:var9:sz_app name:array 0.8 of char=HelloWi n #0;10:Win_Class: WNDCLASSEX; / 窗口类11:w_Ha

3、ndle,i nst:HWND;/w_Ha ndle窗口句柄、程序句柄12:w_msg:TMSG; / 消息数据13:14:fun ctio n Win dowProc(h_Wnd,u_Msg,w_Param,l_Param: LONGINT):LRESULT;stdcall;15:/回调函数16:var p_hdc:hdc;17:p_rect:trect;18:ps : PAINTSTRUCT ;19:begin20:21:22:case u_msg of23:WM_DESTROY : PostQuitMessage (0);24:WM_CREATE : PlaySound (pchar(h

4、ellowin.wav#0),0, SND_FILENAMExSND_ASYNC);25:WM_PAINT :begi n26:p_hdc := Beg inPaint (h_w nd, ps);GetClie ntRect (h_wnd, p_rect);DrawText (p_hdc, pchar(Hello, Windows!#0), -1, p_rect,DT_SINGLELINE or DT_CENTER or DT_VCENTER); En dPa int (h_w nd, ps);end;end;Result := DefWi ndowProc(h_Wnd, u_Msg, w_P

5、aram, l_Param); end;begi nInst := hln sta nee;win_class.cbSize := sizeof (win_class);win_class.style := CS_HREDRAW or CS_VREDRAW ; win_class.lpfnWndProc := Win dowProc ;win_class.cbClsExtra := 0 ;win_class.cbWndExtra := 0 ;win_class.hl nsta nee := Inst ;win_class.hlco n := LoadIcon (0, IDI_APPLICATI

6、ON);win_class.hCursor := LoadCursor (0, IDC_ARROW);win_class.hbrBackgrou nd := HBRUSH (GetStockObject (WHITE_BRUSH); win _class .l pszMe nu Name := nil ;win_class.lpszClassName := sz_AppName ;win_class.hIco nSm := LoadIcon (0, IDI_APPLICATION);RegisterClassEx(Win_Class);w_Ha ndle:=CreateWi ndow(sz_a

7、pp name, pchar(The Hello Program#。), WS_OVERLAPPEDWINDOW,2OO,2OO,3OO,3OO,O,O, In st, nil);ShowWi ndow (w_Ha ndle, SW_SHOWNORMAL);UpdateWi ndow(w_Ha ndle);while(GetMessage(w_msg, 0, 0, 0) do beg inTran slateMessage(w_msg);DispatchMessage(w_msg);end;end.272829303132333435363738394041424344454647484950

8、5152535455565758596061626364656667686970tagWNDCLASSEXA = packed record cbSize: UINT;/style: UINT;/IpfnWndProc: TFNWndProc; / cbCIsExtra: In teger; / cbW ndExtra: In teger;/hln sta nee: HINST;/hIco n: HICON;/hCursor: HCURSOR; / hbrBackgrou nd: HBRUSH; / lpszMe nuName: PAn siChar; / lpszClassName: PAn

9、 siChar; / hIco nSm: HICON;/设置成窗口类型的大小窗口类风格指向该窗口的回调函数(本程序为 窗口类变量的扩展字节数窗口实例的扩展字节数窗口的实例句柄窗口的图标句柄窗口鼠标指针句柄刷新窗口用户区背景的画刷句柄 窗口类包含的菜单的名称窗口类的名称窗口的小图标句柄Win dowProc)以上源程序读者可以直接拷贝到记事本中,把行标去掉后另存为.dpr文件,然后用Delphi直接打开,就可以编译运行,之后你就会听到电脑向你发 出的问候。(hellowin.wav 文件可以自己用 windows录音机录制)其中主程序(40-70行)的功能如下:设置窗口变量(42-53行)注册窗

10、口 (54行)0显示窗口(59-60行)消息循环(63-67行)以下根据以上四部分分别介绍:一、设置窗口变量:每一个标准的Win dows应用程序都至少有一个主窗口,在本程序中代表主窗口的变量就是 Win_Class,它的类型是 WNDCLASSEX 其在windows.pas的声明如下:end;WNDCLASSEXA = tagWNDCLASSEXA;WNDCLASSEX = WNDCLASSEXA;其中style 的设置是以下各值通过位运算符 or (或)联接合成 风格含义Windows 系统应用程序X.1Di sjJDatchMessaIJseGet Mef1rCS HREDRAW如果窗

11、口宽度发生改变,重画整个窗口CS VREDRAW如果窗口咼度发生改变,重画整个窗口CS DBLCLKS能感受窗口中的双击消息CS NOCLOSE禁用系统菜单中的“关闭”命令CS OWNDC为该窗口类的各窗口分配各自独立的设备环境CS CLASSDC为该窗口类的各窗口分配一个共享的设备环境CS PARENTDC指定子窗口继承其父窗口的设备环境CS_SAVEBITS把被窗口遮掩的屏幕图象部分作为位图保存起来。当该窗口被移动时,Windows使用被保存的位图来重建屏幕图象LpfnWndProc域是一个函数指针,它指向窗口的“回调函数”。本程序 回调函数是WindowProc。回调函数指的是本窗口的消

12、息处理函数。 所谓“回调”指的是此函数在本程序中没有语句直接调用它,而调用它的是windows。每个窗口程序建立好之 后,windows为每个程序维护一个“消息队列”。用户的操作如鼠标、键盘输 入等都是先由windows处理接收的,windows判断如果用户的操作是针对本窗 口程序的,就把此消息放到程序的消息队列中。而程序窗口通过消息循环语 句(本程序的63-67行)取出消息(GetMessage函数),最后通过调用DispatchMessage函数把消息传回 windows,再由windows调用回调函数(本 程序是 WindowProC处理消息,回调函数把消息处理完后(很多缺省消息的 处理

13、是回调函数再调用 windows来处理的),windows结束DispatchMessage 调用。应用程序进行下一个消息处理循环。其关系如下图所示:各种事件消息键盘、鼠标、端等消息循环 回调函数_丿X _ _ _消息队列DefWindowProccbCIsExtra和wc.cbWndExtra在大多数情况下都会设为0。hln sta nee它的值是应用程序的实例句柄,表明该窗口与该实例是相 关联的。hlcon是窗口的图标句柄。 hCursor是窗口的鼠标光标句柄。hbrBackground是窗口的背景颜色。IpszMe nuName是标志菜单资源的字符串。IpszClassName此窗口类的

14、名称。hIco nSm是窗口的小图标句柄,它是显示在任务栏上的小图标,和窗口左上角的图 标。二、注册窗口类:用RegisterClassEx 函数注册窗口。其在windows.pas 的声明如下:functionRegisterClassEx(const WndClass: TWndClassEx): ATOM;stdcall;此函数的参数就是窗口类 TwndClassEx,注册成功后返回非零,反之出错 返回0。三、创建显示窗口。创建窗口用CreateWindow函数,他返回一个窗口句柄。其在windows.pas 的声明如下:fun ctio n CreateWi ndow(lpClassN

15、ame: PChar; lpWi ndowName: PChar; dwStyle: DWORDX, Y, nWidth, nHeight: Integer; hWndParent: HWND;hMenu: HMENU; hInstanee: HINST; lpParam: Pointer): HWND;CreateWi ndow函数的参数说明如下:lpClassName创建窗口所用的窗口类的名称lpWi ndowName 窗口标题dwStyle窗口风格,定义为普通型*X窗口位置的x坐标Y窗口位置的y坐标nWidth窗口的宽度nH eigh窗口的高度hWndPare nt父窗口句柄hMe nu

16、菜单句柄hln sta nee应用程序实例句柄lpParam是附加数据指针第三个参数dwStyle的值是窗口的风格,下表列出了常用的风格:风格含义WS_OVERLAPPEDWINDO建一个层叠式窗口,有边框、标题栏、系统菜单、最大最 小化按钮,是以下几种风格的集合: WS OVERLAPPED,WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS MINIMIZEBOX, WS MAXIMIZEBOXWS_POPUPWINDOW创建一个弹出式窗口,是以下几种风格的集合:WS_BORDER,WS_POPUP,WS_SYSWIS_CAPTIC与 WS POPUPWIN

17、DO格必须一起使用才能使窗口菜单可见WS_OVERLAPPED创建一个层叠式窗口,它有标题栏和边框,与WS_TILE风格 一样WS POPUP该窗口为弹出式窗口,不能与 WS CHIL同时使用WS BORDER窗口有单边框WS CAPTION窗口有标题栏WS CHILD该窗口为子窗口,不能与 WS POPUP时使用WS DISABLED该窗口为无效,即对用户操作不产生任何反应WS HSCROLL窗口有水平滚动条WSCONIC窗口初始化为最小化WS MAXIMIZE窗口初始化为最大化WS MAXIMIZEBOX窗口有最大化按钮WS MINIMIZE与 WS MAXIMIZ一样WS MINIMIZ

18、EBOX窗口有最小化按钮WS SIZEBOX边框可进行大小控制的窗口WS_SYSMENU创建一个有系统菜单的窗口,必须与WS_CAPTIC风格同时使 用WS THICKFRAME创建一个大小可控制的窗口,与 WS SIZEBO风格一样.WS TILED创建一个层叠式窗口,有标题栏WS VISIBLE窗口为可见WS VSCROLL窗口有垂直滚动条显示窗口用ShowWindoWS数显示窗口。其在 windows.pas的声明如下:fun ction ShowWi ndow(hWnd: HWND; n CmdShow: In teger): BOOL; stdcall; 其第一个参数hWnd是窗口句

19、柄。第二个参数nCmdSho决定了如何显示窗口,其取值含义如下表:值含义S W_FORCEMINIMIZE在WindowNT5.0中最小化窗口,即使拥有窗口的线程被 挂起也会最小化。在从其他线程最小化窗口时才使用这 个参数。SW MIOE:隐藏窗口并激活其他窗口。SW MAXIMIZE最大化指定的窗口。SW_MINIMIZE最小化指定的窗口并且激活在Z序中的下一个顶层窗口。SW RESTORE激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时, 应用程序应该指定这个标志。SW SHOW在窗口原来的位置以原来的尺寸激活和显示窗口。SW_SHOWDEFA

20、ULT依据在STARTUPINF结构中指定的SW FLA标志设定显 示状态,STARTUPINF结构是由启动应用程序的程序传 递给CreateProcess函数的。SW SHOWMAXIMIZED激活窗口并将其最大化。SW SHOWMINIMIZED激活窗口并将其最小化。SW SHOWMINNOACTIVACI窗口最小化,激活窗口仍然维持激活状态。SW_SHOWNA以窗口原来的状态显示窗口。激活窗口仍然维持激活状 态。SW_SHOWNOACTIVATE以窗口最近一次的大小和状态显示窗口。 激活窗口仍然 维持激活状态。SW_SHOWNQMAL激活并显示一个窗口。如果窗口被最小化或最大化,系 统将

21、其恢复到原来的尺寸和大小。应用程序在第一次显 示窗口的时候应该指定此标志。四、建立消息循环。前面在叙述回调函数时,已经讨论了部分消息循环这方面的内容,在这 我们再详细阐述这方面的内容。先看代码63-67行:63:while(GetMessage(w_msg, w_Ha ndle, 0, 0) do64:begin65:Tran slateMessage(w_msg);66:DispatchMessage(w_msg);67:en d;我们已经知道GetMessage函数的功能是程序从消息队列中取出消息,其在windows.pas中的声明如下:fun ctio n GetMessage(var

22、lpMsg: TMsg; hWnd: HWND; wMsgFilterMi n,wMsgFilterMax: UINT): BOOL; stdcall;第一个参数是要接收消息的 MSG结构变量,其声明为:tagMSG = packed recordhwnd: HWND;message: UINT;wParam: WPARAM;lParam: LPARAM;time: DWORD;pt: TPoi nt;end;$EXTERNALS YM tagMSGTMsg = tagMSG;MSG = tagMSG;$EXTERNALS YM MSG其各域的说明如下:hwnd接收消息的窗口句柄,如果一个应用

23、程序中有多个窗口, 此参数 就可决定让哪个窗口接收消息。message是一个32位无符号整数,它唯一标识了一种消息类型。每种 消息类型都在Messages.PAS文件中定义了,这些常量都以 WM开头。 比如说当窗口建立时, Win dows就向应用程序发送一条 WM_CREATE 息。wParam副消息值,其具体含义依赖于主消息值。 lParam副消息值,其具体含义依赖于主消息值。time消息放入消息队列中的时间,是从Windows启动后所测量的时间 值。Windows用这个域来使用消息保持正确的顺序。pt消息放入消息队列时的鼠标坐标。GetMessage函数第二个参数表示窗口句柄,NULL则

24、表示要获取该应用程 序创建的所有窗口的消息;第三,四参数指定消息范围。后面三个参数被设 置为默认值(0,0,0),这就是表示程序将接收所有属于它的任何一个窗口 的所有消息。在接收到 WM_QU消息后GetMessage函数返回假(FALSE,除 了 WM_QUI消息GetMessage函数对其余消息都返回 TRUE因此,在接收到 WM_QU之前,程序中的消息循环(63-67行)可以一直循环下去。在接收到 WM_QUI之后意味着程序消息循环结束,终止程序。在GetMessage函数执行后是 TranslateMessage函数,此函数进行一些 键盘消息转换(以后在详细讨论)。然后是Dispatc

25、hMessage函数将消息结构回传给Windows Windows再调用程序本身的回调函数来完成各种消息的处理,以便程序实现各种功能。在 此我们详细看一下回调函数的结构。本程序的回调函数是从14行到35行:14:fun ctio n Win dowProc(h_Wnd,u_Msg,w_Param,l_Param: LONGINT):LRESULT;stdcall;15:回调函数16:var p_hdc:hdc;17: p_rect:trect;18: ps : PAINTSTRUCT ;19:begin20:2122:case u_msg of23: WM_DESTROY : PostQuit

26、Message (0);24: WM_CREATE :PlaySou nd(pchar(hellowi n.wav#0),0,SND_FILENAME or SND_ASYNC);25: WM_PAINT :begin26:p_hdc := Begi nPaint (h_w nd, ps);27:GetClie ntRect (h_wnd, p_rect);28:DrawText (p_hdc, pchar(Hello, Win dows!#0), -1,p_rect,29:DT_SINGLELINE or DT_CENTER orDT_VCENTER);30:En dPai nt (h_wn

27、d, ps);31:en d;32:33: end;34: Result := DefWi ndowProc(h_Wnd, u_Msg, w_Param, l_Param);35:en d;回调函数(本例是WindowProO的参数格式是固定的,四个 32位长整数: h_wnd是接收消息窗口的句柄(实际上就是 32位长整数) u_Msg是主消息值 w_Param是副消息值 l_Param是副消息值容易看出本程序处理了三个消息:WM_DESTR(注销窗口消息,第23行,施行停机处理。此消息只出 现一次,即窗口关闭时。WM_CREA窗口建立消息,第24行用PlaySound函数播放一段.wav 声

28、音文件文件。此消息只出现一次,即窗口创建时。WM_PAINT窗口重画消息,第25行到第31行,在窗口的用户区当 中位置显示“ Hello, Windows! ”。此消息发生的比较频繁,当窗口 被调整大小时,被遮挡重新显示时等都发生此消息。此段程序的原 理在下一节详细论述。由程序结构可以知道,回调函数主要用了 case语句解析判断u_msg中的 消息,做分门别类的处理。以上程序只处理了三条消息,实际上在消息队列 中还有很多消息,比如: WM_MO(窗口移动)、WM_KEYDOWN盘消息)、WM_RBUTTONDOW标按键消息)等等,这些消息需要 Win dows进行处理, 为此在函数的最后,需要调用 DefWindowProc函数让 Windows来对所有消息 进行缺省处理。综合以上所述,一个标准的 Win dows程序分成两部分: 主程序建立程序

温馨提示

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

评论

0/150

提交评论