|
|
八、初步的封装, 面向过程的方式的编写
可以看到对于任何一个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 .
|
|