(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)\Embarcadero\Studio\18.0\source\rtl\win\”,如果不是我这个版本的Delphi,那么应该在你的Delphi安装目录的“source\rtl\win\”目录里!

转载于:https://www.cnblogs.com/sunylat/p/6217544.html

Creating Windows CreateMDIWindow CreateWindow CreateWindowEx RegisterClass RegisterClassEx UnregisterClass Message Processing BroadcastSystemMessage CallNextHookEx CallWindowProc DefFrameProc DefMDIChildProc DefWindowProc DispatchMessage GetMessage GetMessageExtraInfo GetMessagePos GetMessageTime GetQueueStatus InSendMessage PeekMessage PostMessage PostQuitMessage PostThreadMessage RegisterWindowMessage ReplyMessage SendMessage SendMessageCallback SendMessageTimeout SendNotifyMessage SetMessageExtraInfo SetWindowsHookEx TranslateMessage UnhookWindowsHookEx WaitMessage Window Information AnyPopup ChildWindowFromPoint ChildWindowFromPointEx EnableWindow EnumChildWindows EnumPropsEx EnumThreadWindows EnumWindows FindWindow FindWindowEx GetClassInfoEx GetClassLong GetClassName GetClientRect GetDesktopWindow GetFocus GetForegroundWindow GetNextWindow GetParent GetProp GetTopWindow GetWindow GetWindowLong GetWindowRect GetWindowText GetWindowTextLength IsChild IsIconic IsWindow IsWindowEnabled IsWindowUnicode IsWindowVisible IsZoomed RemoveProp SetActiveWindow SetClassLong SetFocus SetForegroundWindow SetParent SetProp SetWindowLong SetWindowText WindowFromPoint Processes and Threads CreateEvent CreateMutex CreateProcess CreateSemaphore CreateThread DeleteCriticalSection DuplicateHandle EnterCriticalSection ExitProcess ExitThread GetCurrentProcess GetCurrentProcessId GetCurrentThread GetCurrentThreadId GetExitCodeProcess GetExitCodeThread GetPriorityClass GetThreadPriority GetWindowThreadProcessId InitializeCriticalSection InterlockedDecrement InterlockedExchange InterlockedIncrement LeaveCriticalSection OpenEvent OpenMutex OpenProcess OpenSemaphore PulseEvent ReleaseMutex ReleaseSemaphore ResetEvent ResumeThread SetEvent SetPr
Delphi获取Windows版本号、描述等信息,可获取到主版本号、次版本号、系统描述、系统平台、构建号等,相关代码如下:   //设置版本信息结构的大小    GetVersionEx(OSVI);    //获取版本信息    is98orlater:=    //判断是否98或以后版本    (osvi.dwPlatformId=VER_PLATFORM_WIN32_WINDOWS) and    ((osvi.dwMajorVersion>4) or    ((osvi.dwMajorVersion=4) and (osvi.dwMinorVersion>0)));   //DOWNLOAD BY HTTP://WWW.CODEFANS.NET    //下面开始显示信息    case OSVI.dwPlatformId of    //根据OSVI.dwPlatformId的数值的不同显示具体的平台描述    VER_PLATFORM_WIN32s:    // Windows 3.1平台    s:='Windows 3.1';    VER_PLATFORM_WIN32_WINDOWS:    // Windows 95/98平台    if(is98orlater) then    //98    s:='Windows 98'    else    //95    s:='Windows 95';    VER_PLATFORM_WIN32_NT:    // Windows NT平台    s:='Windows NT/XP';    end;    Edit1.Text:=s;    Edit2.Text:=IntToStr(OSVI.dwMajorVersion);    Edit3.Text:=IntToStr(OSVI.dwMinorVersion);    case OSVI.dwPlatformId of    //根据平台的不同具体处理OSVI.dwBuildNumber信息    VER_PLATFORM_WIN32_WINDOWS:    // Windows 95/98平台则取OSVI.dwBuildNumber的低位字    Edit4.Text:=IntToStr(LOWORD(OSVI.dwBuildNumber));    VER_PLATFORM_WIN32_NT:    // Windows NT平台则取所有位的值    Edit4.Text:=IntToStr(OSVI.dwBuildNumber);    else    Edit4.Text:='';   // Windows 3.1平台此值位空    end;    Edit5.Text:=OSVI.szCSDVersion;   end;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值