zoukankan      html  css  js  c++  java
  • (Delphi)第一个Windows 32 API的窗口程序

    program Project1;
    
    uses
      Winapi.Windows,
      Winapi.messages;
    
    {$R *.res}
    
    const
      className = 'MyDelphiWindow'; // 窗口类名称
      windowTitle = 'Delphi使用 Windows API 创建的窗口'; // 窗口标题
    
    var
      curMessage: TMsg; // 消息结构
      windowHandle: HWND; // 窗口句柄
    
      windowClass: TWndClass; // 窗口类变量
      registerResult: integer; // 注册窗口类返回结果
    
      {
        // 窗口过程,此过程为操作系统回调函数,当接收到各种消息时候,操作系统会调用此函数。
        //同时也是我们编写的客户端程序,处理各种事件的地方
    
        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;
    
    begin
    
      // 配置windows窗口类
      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 := RegisterClass(windowClass);
      if registerResult = 0 then
      begin
        messageBox(0, '注册窗口类失败!', nil, MB_OK);
        exit;
      end;
    
      {
        // 创建窗口
        CreateWindowEx:https://msdn.microsoft.com/en-us/library/ms632680(VS.85).aspx
      }
      windowHandle := 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.

     代码理解:

    (2016-12-24)

    01,Delphi怎么调用Windows  API?

    Windows API基本上都是以动态链接库方式提供的,如果想编写Windows应用程序,那肯定是要调用包含这些API的动态链接库了!Delphi当然也是通过调用动态链接库方式来调用Windows API!

    02,WinMain函数在哪里?

    WinMain函数是所有Win32程序的入口函数,在这里真的没有找到,应该是Delphi帮我们在背后处理了!从这个工程的代码上来看,整个工程的begin和end就应该是这个窗口程序的WinMain函数的作用域!

    03,这个窗口程序怎么创建的?

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

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

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

     D,获取Windows消息并处理:

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

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

    04,这个窗口程序怎么处理属于它的事件?

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

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

    05,WindowProc中怎么又那么多case语句?case语句的判断条件怎么都是“WM”开头呢?

    这个函数通过case语句来判断当前接收到的Windows消息类型,从而根据不同事件来进一步处理。

    “WM”开头的判断条件都是Windows消息,windows消息都是以“WM”开头,例如:“WM_CREATE”,这个就是窗口创建消息,这个应该对应Delphi的Form里面的OnCreate事件。

    在这个函数里面还有一个DefWindowProc函数,这个是默认消息处理函数,如果当前Windows消息不在我们需要处理的消息范围内,则由它来处理当前消息。

    06,我能在我的计算机里面找到“Winapi.Windows.pas”和“Winapi.messages.pas”这两个单元文件吗?

    可以,我使用Delphi 10 Update2,这两个单元文件所在目录:“C:Program Files (x86)EmbarcaderoStudio18.0source tlwin”,如果不是我这个版本的Delphi,那么应该在你的Delphi安装目录的“source tlwin”目录里!

  • 相关阅读:
    hdu4722Good Numbers(dp)
    poj3373Changing Digits(dp)
    URAL1244. Gentlemen(背包)
    URAL1658. Sum of Digits(DP)
    URAL1635. Mnemonics and Palindromes(DP)
    URAL(DP集)
    URAL1036. Lucky Tickets
    关于int类型的赋值语句正确的有
    float、double的有效位数
    浮点型常量又称实型常量,用于表示有小数部分的十进制数,他有两种表示形式,分别为:
  • 原文地址:https://www.cnblogs.com/sunylat/p/6217544.html
Copyright © 2011-2022 走看看