Delphi直接用Windows API编程

2019-03-04 13:38

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

API是(Application Programming Interface)的缩写,意为应用编程界面,它包含了编写Windows所有函数、数据类型。VCL就是以它为基础进行封装的,它是应用程序在Windows 上运行的基础。通过熟悉使用WINDOWS API SDK直接编制WINDOWS程序,程序员将对WINDOWS的执行机制有更深入的了解,从而编写出更高效、实用的程序。

下面是我们用API函数建立的第一个程序:

1 : program HELLOWIN; 2 :

3 : uses

4 : windows, Messages ,mmsystem; 5 : 6 : 7 : 8 : var

9 : sz_appname:array [0..8] of char='HelloWin'#0; 10 : Win_Class: WNDCLASSEX; //窗口类

11 : w_Handle,inst:HWND;//w_Handle窗口句柄、程序句柄 12 : w_msg:TMSG; //消息数据 13 :

14 : function WindowProc(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 : begin 20 : 21 :

22 : case u_msg of

23 : WM_DESTROY : PostQuitMessage (0);

24 : WM_CREATE : PlaySound (pchar('hellowin.wav'#0), 0, SND_FILENAME or SND_ASYNC) ;

25 : WM_PAINT :begin

26 : p_hdc := BeginPaint (h_wnd, ps) ;

1

27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : GetClientRect (h_wnd, p_rect);

DrawText (p_hdc, pchar('Hello, Windows!'#0), -1, p_rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER) ; EndPaint (h_wnd, ps) ; end;

end;

Result := DefWindowProc(h_Wnd, u_Msg, w_Param, l_Param); end;

begin

Inst := hInstance;

win_class.cbSize := sizeof (win_class) ;

win_class.style := CS_HREDRAW or CS_VREDRAW ; win_class.lpfnWndProc := @WindowProc ; win_class.cbClsExtra := 0 ; win_class.cbWndExtra := 0 ; win_class.hInstance := Inst ;

win_class.hIcon := LoadIcon (0, IDI_APPLICATION) ; win_class.hCursor := LoadCursor (0, IDC_ARROW) ;

win_class.hbrBackground := HBRUSH (GetStockObject (WHITE_BRUSH)) ; win_class.lpszMenuName := nil ;

win_class.lpszClassName := @sz_AppName ;

win_class.hIconSm := LoadIcon (0, IDI_APPLICATION) ; RegisterClassEx(Win_Class);

w_Handle:=CreateWindow(@sz_appname, pchar('The Hello Program'#0), WS_OVERLAPPEDWINDOW,200,200,300,300,0,0, Inst,nil) ;

ShowWindow (w_Handle, SW_SHOWNORMAL) ; UpdateWindow(w_Handle);

while(GetMessage(w_msg, 0, 0, 0)) do begin

TranslateMessage(w_msg); DispatchMessage(w_msg); end;

end.

2

以上源程序读者可以直接拷贝到记事本中,把行标去掉后另存为.dpr文件,然后用Delphi直接打开,就可以编译运行,之后你就会听到电脑向你发出的问候。(hellowin.wav文件可以自己用windows录音机录制)

其中主程序(40-70行)的功能如下:

设置窗口变量(42-53行)

注册窗口(54行)

显示窗口(59-60行)

消息循环(63-67行)

以下根据以上四部分分别介绍:

一、设置窗口变量:每一个标准的Windows应用程序都至少有一个主窗口,在本程序中代表主窗口的变量就是Win_Class,它的类型是 WNDCLASSEX,其在windows.pas的声明如下:

tagWNDCLASSEXA = packed record

cbSize: UINT; //设置成窗口类型的大小 style: UINT; //窗口类风格

lpfnWndProc: TFNWndProc; //指向该窗口的回调函数(本程序为WindowProc) cbClsExtra: Integer; //窗口类变量的扩展字节数 cbWndExtra: Integer; //窗口实例的扩展字节数 hInstance: HINST; //窗口的实例句柄 hIcon: HICON; //窗口的图标句柄 hCursor: HCURSOR; //窗口鼠标指针句柄

hbrBackground: HBRUSH; //刷新窗口用户区背景的画刷句柄 lpszMenuName: PAnsiChar; //窗口类包含的菜单的名称 lpszClassName: PAnsiChar;; //窗口类的名称 hIconSm: HICON; //窗口的小图标句柄 end;

WNDCLASSEXA = tagWNDCLASSEXA; WNDCLASSEX = WNDCLASSEXA;

? 其中style的设置是以下各值通过位运算符or(或)联接合成。 风 格 含 义 3

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

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

? cbClsExtra和wc.cbWndExtra在大多数情况下都会设为0。

? hInstance它的值是应用程序的实例句柄,表明该窗口与该实例是相

4

关联的。

? hIcon是窗口的图标句柄。

? hCursor是窗口的鼠标光标句柄。 ? hbrBackground是窗口的背景颜色。

? lpszMenuName是标志菜单资源的字符串。 ? lpszClassName此窗口类的名称。 ? hIconSm是窗口的小图标句柄,它是显示在任务栏上的小图标,和窗口左上角的图标。

二、注册窗口类:用RegisterClassEx函数注册窗口。其在windows.pas的声明如下:

function RegisterClassEx(const WndClass: TWndClassEx): ATOM; stdcall;

此函数的参数就是窗口类TwndClassEx,注册成功后返回非零,反之出错返回0。

三、创建显示窗口。

创建窗口用CreateWindow函数,他返回一个窗口句柄。其在windows.pas的声明如下:

function CreateWindow(lpClassName: PChar; lpWindowName: PChar; dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND; CreateWindow函数的参数说明如下:

? lpClassName 创建窗口所用的窗口类的名称 ? lpWindowName 窗口标题

? dwStyle 窗口风格,定义为普通型* ? X 窗口位置的x坐标 ? Y 窗口位置的y坐标 ? nWidth 窗口的宽度 ? nHeigh 窗口的高度 ? hWndParent 父窗口句柄 ? hMenu 菜单句柄

? hInstance 应用程序实例句柄 ? lpParam 是附加数据指针 第三个参数dwStyle 的值是窗口的风格,下表列出了常用的风格:

风 格 含 义 WS_OVERLAPPEDWINDOW 创建一个层叠式窗口,有边框、标题栏、系统菜单、最大最小化按钮,是以下几种风格的集合:WS_OVERLAPPED, 5


Delphi直接用Windows API编程.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:证券投资学计算题练习

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: