博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(Delphi)第一个Windows 32 API的窗口程序
阅读量:4541 次
发布时间:2019-06-08

本文共 4280 字,大约阅读时间需要 14 分钟。

 

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

你可能感兴趣的文章
[转载]T-SQL(MSSQL)语句查询执行顺序
查看>>
SignalR 行实时通信最大连接数
查看>>
开发进度6
查看>>
php方法重载
查看>>
三次握手和四次挥手(二)
查看>>
MySQL中的索引
查看>>
Android开发之手势滑动(滑动手势监听)详解
查看>>
switch
查看>>
HTTP错误code大全
查看>>
PAT Advanced Level 1043
查看>>
决策树基础
查看>>
献给程序员之如何与陌生人交谈
查看>>
C++重载运算符练习--对people类重载“= =”运算符和“=”运算符
查看>>
Nmap命令的实用范例
查看>>
7-1 查找整数编程总结
查看>>
安装PHP以及搭建博客(一)
查看>>
关于WORD文档的读取乱码问题
查看>>
[问题记录.dotnet]取网卡信息报错"找不到"-WMI - Not found
查看>>
Codeforces Round #254 (Div. 2):B. DZY Loves Chemistry
查看>>
linux 安装虚拟机
查看>>