阅读新闻

Delpih中的Windows API编程初步

[日期:2007-09-16] 来源:  作者: [字体: ]
         
下面是一个例子:

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 .


上一页123下一页  GO
阅读:
录入:admin

评论 】 【 推荐 】 【 打印
上一篇:如何用D3D/OpenGL在制作2D游戏中高效地显示文字
下一篇:水体裁减体的生成与水体的裁减(原创)
相关新闻      
本文评论       全部评论
  谢谢,很详细!   (pxf ,02月21日 )
发表评论
字数
姓名:

  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款