(一)第一个窗口程序

program Project1;

uses
  Winapi.Windows,
  Winapi.messages;

{$R *.res}

const
  className = 'MyDelphiWindow'; // 窗口类名称
  windowTitle = 'Delphi使用 Windows API 创建的窗口'; // 窗口标题

var
  curMessage: TMsg; // 消息结构
  windowHandle: HWND; // 窗口句柄

  {
    // 窗口过程,此过程为操作系统回调函数,当接收到各种消息时候,操作系统会调用此函数。
    //同时也是我们编写的客户端程序,处理各种事件的地方

    WindowProc:https://msdn.microsoft.com/en-us/library/ms633573.aspx
  }
function WindowProc(theWindow: HWND; theMessage, WParam, LParam: longint)
  : longint; stdcall; export;
var
  hdcParam: HDC;
  psStruct: PAINTSTRUCT;
  rect: TRect;
begin
  case theMessage of
    WM_CREATE:
      begin
        messageBox(0, '接收到"WM_CREATE"消息了,开始创建窗口了!', nil, MB_OK);
      end;
    WM_DESTROY:
      begin
        PostQuitMessage(0);
        exit;
      end;
    WM_PAINT:
      begin
        hdcParam := BeginPaint(theWindow, psStruct);

        GetClientRect(theWindow, rect);

        DrawText(hdcParam, PWChar('接收到"WM_PAINT"消息了,这是输出的文字!'), -1, rect,
          DT_SINGLELINE OR DT_CENTER OR DT_VCENTER);

        EndPaint(theWindow, psStruct);
      end;
    // WM_SIZE: //窗口尺寸变化消息
    // begin
    // messageBox(0, '窗口尺寸发生变化了!', nil, MB_OK);
    // end;
  end;

  result := DefWindowProc(theWindow, theMessage, WParam, LParam);
end;

// 注册窗口类
function RegisterClass: boolean;
var
  windowClass: TWndClass; // 窗口类变量
  registerResult: integer; // 注册窗口类返回结果
  isRegisterSuccess: boolean; // 是否注册窗口成功
begin

  // 是否注册窗口类成功的默认值为true
  isRegisterSuccess := true;

  windowClass.style := CS_HREDRAW or CS_VREDRAW; { 类风格 }
  windowClass.lpfnWndProc := @WindowProc; { 窗口处理过程 }
  windowClass.cbClsExtra := 0;
  windowClass.cbWndExtra := 0;
  windowClass.hInstance := hInstance;
  windowClass.hIcon := LoadIcon(0, IDI_APPLICATION); { 使用默认程序图标 }
  windowClass.hCursor := LoadCursor(0, IDC_UPARROW);
  windowClass.hbrBackground := COLOR_WINDOW;
  windowClass.lpszMenuName := nil;
  windowClass.lpszClassName := PWChar(className);

  {
    //注册窗口类
    RegisterClass:https://msdn.microsoft.com/en-us/library/ms633586(VS.85).aspx
  }
  registerResult := Winapi.Windows.RegisterClass(windowClass);
  if registerResult = 0 then
  begin
    isRegisterSuccess := false;
  end;

  result := isRegisterSuccess;
end;

begin

  // 注册窗口类
  if not RegisterClass then
  begin
    messageBox(0, '注册窗口类失败!', nil, MB_OK);
    exit;
  end;

  {
    // 创建窗口
    CreateWindowEx:https://msdn.microsoft.com/en-us/library/ms632680(VS.85).aspx
  }
  windowHandle := Winapi.Windows.CreateWindowEx(0, { 扩展风格无 }
    PWChar(className), { 类名称 }
    PWChar(windowTitle), { 窗口标题 }
    WS_OVERLAPPEDWINDOW OR WS_VISIBLE, { 窗口风格(通用) }
    CW_USEDEFAULT, { 水平位置为默认 }
    CW_USEDEFAULT, { 垂直位置为默认 }
    CW_USEDEFAULT, { 宽度默认 }
    CW_USEDEFAULT, { 高度默认 }
    0, { 父窗口句柄 }
    0, { 菜单无 }
    hInstance, { 程序实例 }
    nil { 附加信息无 }
    );

  // 创建窗口失败处理代码
  if windowHandle = 0 then
  begin
    messageBox(0, '创建窗口类失败!', nil, MB_OK);
    exit;
  end
  else
  begin
    // 显示窗体
    ShowWindow(windowHandle, SW_SHOWNORMAL);

    // 更新窗体内容
    UpdateWindow(windowHandle);
  end;

  {
    // 消息循环
    GetMessage:https://msdn.microsoft.com/en-us/library/ms644936.aspx
  }
  while GetMessage(curMessage, 0, 0, 0) do
  begin
    // https://msdn.microsoft.com/zh-cn/library/ms644955.aspx
    TranslateMessage(curMessage);

    // https://msdn.microsoft.com/en-us/library/ms644934(VS.85).aspx
    DispatchMessage(curMessage);
  end;

end.

这是我第一次用Delphi直接调用Windows API方式写的窗口程序!!

这个程序和《Windows程序设计》里面的第一个Windows窗口程序基本相同!Delphi对Windows API几乎进行了全部的封装,都有对应的Delphi的函数!!

“Winapi.Windows.pas”和“Winapi.messages.pas”所在位置:

C:\Program Files (x86)\Embarcadero\Studio\18.0\source\rtl\win\

上面两个单元都在上面的目录里,我使用的是Delphi 10 Update2,如果你不是我这个版本的Delphi,那么应该在你的Delphi安装目录中的“source\rtl\win\”中!

WindowProc 函数是操作系统回调函数,当有事件发生时候,操作系统就会通过调用它来处理各种事件了,实际上我们在Delphi里面进行的各种事件编程,就是处理这里面的代码,对应各种消息,对各种消息处理!!

windowClass: TWndClass,它决定了我们程序初始化显示时候的样子!!

CreateWindowEx,完成了窗口的创建工作!

通过while循环调用GetMessage,我们获得各种消息!!

通过Windows API方式编写一个窗口程序,基本步骤就是这样:

一,注册窗口类:通过RegisterClass函数实现,参数必须是一个窗口类,在Delphi里面这个类是TWndClass。

二,创建窗口:通过CreateWindowEx函数实现。

三,更新窗口显示内容:通过ShowWindow和UpdateWindow来完成。

四,获取Windows消息并处理:

      1,获取消息:通过while循环调用GetMessage实现。

       2,处理消息:编写一个窗口过程,在这里就是WindowProc,在这个函数中处理各种window消息,写自己的逻辑代码!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值