WindowClass . style : = CS_VREDRAW + CS_HREDRAW + CS_DBLCLKS ;
WindowClass . lpfnWndProc : = @DefWindowProc ;
WindowClass . hCursor : = LoadCursor ( 0 , IDC_ARROW ) ;
WindowClass . hbrBackground : = 0 ;
WindowClass . hInstance : = Hinstance ;
StrPCopy ( WinClassName , ClassName ) ;
五、注册窗口类
当我们按照程序的要求创建了这个窗口类之后,我们就可以在系统中注册它了。这就要用到function RegisterClass(const lpWndClass: TWndClass): ATOM; stdcall;这样一个函数了。他只有一个参数,就是我们先前说注册的窗口类。
六、创建窗口
有了前面几步,现在我们可以创建我们所注册的窗口,看看她的真面目了。
function CreateWindow ( lpClassName : Pchar ; lpWindowName : PChar ;
dwStyle : DWORD ; X , Y , nWidth , nHeight : Integer ; hWndParent : HWND ;
hMenu : HMENU ; hInstance : HINST ; lpParam : Pointer ) : HWND ;
这个函数可以帮助我们创建我们先前注册的窗口。其中的参数lpClassName : Pchar表示我们前面注册的窗口类的名称。lpWindowName : PChar 表示窗口的标题; dwStyle : DWORD 表示窗口的风格; X , Y , nWidth , nHeight : Integer ; 表示窗口的位置和宽度高度;
七、显示窗口
窗口创建了,但我们只有在调用function ShowWindow ( hWnd : HWND ; nCmdShow : Integer ) : BOOL ; stdcall ;函数之后才会显示出来。这个函数很简单,hWnd : HWND 表示窗口的句柄, nCmdShow : Integer则是窗口的显示方式。function UpdateWindow ( hWnd : HWND ) : BOOL ; stdcal l ;函数则会送出一个WM_PAINT消息,使窗体得到更新。
也许你会觉得很烦人,但这是所有windows程序的基础,即便是我们用delphi编程时,程序也都是这样运行的,只是delphi的创造者将一切都隐藏到了一个美丽外表之下。
下面我们用大家最常见的一个例子对前面的知识加以总结。在这个例子中,我们将在窗体中显示“ hello , world ! ” 。下面是程序及其运行效果:
program Project1;
{ $ APPTYPE CONSOLE }
uses
Windows ,
Messages ;
{ uses SysUtils ; }
var
wClass : TWndClass; // 主窗口类
hInst , //应用程序句柄
Handle : HWnd ; // 主窗口
aMsg : TMsg ; //消息
RCT : TRect ; //区域
ps : TPaintStruct ; //显示
dc : hdc ; //设备上下文
//函数:WindowProc
//作用:处理主窗口的消息
function WindowProc ( hWnd , Msg , wParam , lParam : Longint ) : Longint ; stdcall ;
begin
WindowProc : = 0 ;
case Msg of
WM_PAINT :
begin
dc : =BeginPaint ( hWnd , ps ) ;
GetClientRect ( hWnd , RCT ) ;
DrawText ( dc , ' hello , world ! ' , -1 , RCT , Dt_SINGLELINE or DT_CENTER or DT_VCENTER ) ;
EndPaint ( hWnd , ps ) ;
Exit ;
end ;
WM_DESTROY : //结束应用程序
Begin
PostQuitMessage ( 0 ) ;
Exit ;
end ;
end ;
Result : = DefWindowProc ( hWnd , Msg , wParam , lParam ) ; //消息默认处理
end ;
//主窗口
begin
// hInst : = GetModuleHandle ( nil ) ; // 获得应用程序句柄
with wClass do //初始化窗口类
begin
hInstance : = system.MainInstance ;
Style : = CS_HREDRAW or CS_VREDRAW ;
HIcon : = LoadIcon ( 0 , IDI_APPLICATION ) ;
LpfnWndProc : = @WindowProc ;
HbrBackground : = GetStockObject ( WHITE_BRUSH ) ;
lpszClassName : = ' Sample Class ' ;
hCursor : = LoadCursor ( 0 , IDC_ARROW ) ;
end ;
RegisterClass ( wClass ) ; // 注册窗口类
//创建主窗口
Handle : = CreateWindow (
' Sample Class ' , // 窗口类名
' Windows API在Delphi中的应用 ' , //窗口标题
WS_OVERLAPPEDWINDOW or WS_VISIBLE , // 窗口风格
10 , //左边界坐标
10 , //上边界坐标
400 , // 宽度
300 , // 高度
0 , // 父窗口句柄
0 , //菜单句柄
system . MainInstance , // 应用程序实例
nil //创建窗口的附加参数
) ;
if Handle <> 0 then
begin
ShowWindow ( Handle , SW_SHOW ) ;
UpdateWindow ( Handle ) ;
end ;
while ( GetMessage ( aMsg , Handle , 0 , 0 ) ) do //消息循环
begin
TranslateMessage ( aMsg ) ; //翻译消息
DispatchMessage ( aMsg ) ; //发送消息
end ;
end .
效果如下图:

八、初步的封装, 面向过程的方式的编写
可以看到对于任何一个Windows程序的创建和运行都要经过上面的几个步骤,而且这些步骤又很有条理,所以我们又可以将不同的功能封装在几个命名规范且容易理解的函数之中。下面是修改后的程序代码:
program Project1;
{ $ APPTYPE CONSOLE }
uses
Windows ,
Messages ;
{ uses SysUtils ; }
var
wClass : TWndClass; // 主窗口类
hInst , //应用程序句柄
Handle : HWnd ; // 主窗口
aMsg : TMsg ; //消息
RCT : TRect ; //区域
ps : TPaintStruct ; //显示
dc : hdc ; //设备上下文
//函数:WindowProc
//作用:处理主窗口的消息
function WindowProc ( hWnd , Msg , wParam , lParam : Longint ) : Longint ; stdcall ;
begin
WindowProc : = 0 ;
case Msg of
WM_PAINT :
begin
dc : =BeginPaint ( hWnd , ps ) ;
GetClientRect ( hWnd , RCT ) ;
DrawText ( dc , ' hello , world ! ' , -1 , RCT , Dt_SINGLELINE or DT_CENTER or DT_VCENTER ) ;
EndPaint ( hWnd , ps ) ;
Exit ;
end ;
WM_DESTROY : //结束应用程序
Begin
PostQuitMessage ( 0 ) ;
Exit ;
end ;
end ;
Result : = DefWindowProc ( hWnd , Msg , wParam , lParam ) ; //消息默认处理
end ;
//函数:WinRegister
//作用:注册窗口类
function WinRegister : Boolean ;
begin
with wClass do //初始化窗口类
begin
hInstance : = system.MainInstance ;
Style : = CS_HREDRAW or CS_VREDRAW ;
HIcon : = LoadIcon ( 0 , IDI_APPLICATION ) ;
LpfnWndProc : = @WindowProc ;
HbrBackground : = GetStockObject ( WHITE_BRUSH ) ;
lpszClassName : = ' Sample Class ' ;
hCursor : = LoadCursor ( 0 , IDC_ARROW ) ;
end ;
ReSult : = RegisterClass ( wClass ) <> 0 ; // 注册窗口类
end ;
//函数:WinCreate
//作用:创建窗口
function WinCreate : HWnd ;
begin
//创建主窗口
Handle : = CreateWindow (
' Sample Class ' , // 窗口类名
' Windows API在Delphi中的应用 ' , //窗口标题
WS_OVERLAPPEDWINDOW or WS_VISIBLE , // 窗口风格
10 , //左边界坐标
10 , //上边界坐标
400 , // 宽度
300 , // 高度
0 , // 父窗口句柄
0 , //菜单句柄
system . MainInstance , // 应用程序实例
nil //创建窗口的附加参数
) ;
if Handle <> 0 then
begin
ShowWindow ( Handle , SW_SHOW ) ;
UpdateWindow ( Handle ) ;
end ;
Result : = Handle ;
end ;
//主窗口
//程序的进入点
begin
if not WinRegister then //调用函数:WinRegister注册窗口类
begin
MessageBox ( 0 , ‘ Register failed ‘ , nil , MB_OK ) ;
Exit ;
end ;
Handle : = WinCreate ; //调用函数:WinCreate创建窗口
if longint ( Handle ) = 0 then
begin
MessageBox ( 0 , ‘ WinCreate failed ‘ , nil , MB_OK ) ;
Exit ;
end;
while ( GetMessage ( aMsg , Handle , 0 , 0 ) ) do //消息循环
begin
TranslateMessage ( aMsg ) ; //翻译消息
DispatchMessage ( aMsg ) ; //发送消息
end ;
end .

谢谢,很详细!