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(, '接收到"WM_CREATE"消息了,开始创建窗口了!', nil, MB_OK);
end;
WM_DESTROY:
begin
PostQuitMessage();
exit;
end;
WM_PAINT:
begin
hdcParam := BeginPaint(theWindow, psStruct); GetClientRect(theWindow, rect); DrawText(hdcParam, PWChar('接收到"WM_PAINT"消息了,这是输出的文字!'), -, 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 := ;
windowClass.cbWndExtra := ;
windowClass.hInstance := hInstance;
windowClass.hIcon := LoadIcon(, IDI_APPLICATION); { 使用默认程序图标 }
windowClass.hCursor := LoadCursor(, 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 = then
begin
messageBox(, '注册窗口类失败!', nil, MB_OK);
exit;
end; {
// 创建窗口
CreateWindowEx:https://msdn.microsoft.com/en-us/library/ms632680(VS.85).aspx
}
windowHandle := CreateWindowEx(, { 扩展风格无 }
PWChar(className), { 类名称 }
PWChar(windowTitle), { 窗口标题 }
WS_OVERLAPPEDWINDOW OR WS_VISIBLE, { 窗口风格(通用) }
CW_USEDEFAULT, { 水平位置为默认 }
CW_USEDEFAULT, { 垂直位置为默认 }
CW_USEDEFAULT, { 宽度默认 }
CW_USEDEFAULT, { 高度默认 }
, { 父窗口句柄 }
, { 菜单无 }
hInstance, { 程序实例 }
nil { 附加信息无 }
); // 创建窗口失败处理代码
if windowHandle = then
begin
messageBox(, '创建窗口类失败!', 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, , , ) 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\”目录里!

(Delphi)第一个Windows 32 API的窗口程序的更多相关文章

  1. [C语言](一)第一个Windows 32 API的窗口程序

    #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain( ...

  2. (Delphi) Windows 32 API程序设计目录

    这里所有程序均使用Delphi调用Windows 32 API方式实现,并不是使用VCL已经封装好的类实现的! (一)第一个窗口程序 01 创建第一个窗口.

  3. 一个执行Dos命令的窗口程序,与各位分享。

    一个执行Dos命令的窗口程序,与各位分享.   效果图:     具体实现在代码中有详细的注释,请看代码.   实现执行CMD命令的核心代码(Cmd.cs):   [csharp]   using S ...

  4. (C) Windows 32 API程序设计目录

    (一)第一个窗口程序 01 创建第一个窗口. (二)输出文本 01 获取Windows图形构件大小信息

  5. Delphi使用TObject类对象创建接受window消息(使用Classes.AllocateHWnd为对象创建一个尺寸为0的窗口,从而有了Handle)good

    在delphi中,有时候我们希望对象可以接收windows消息,怎么办呢?因为要接收windows消息起码要有windows Handle,难道要建立的一个可见窗口?那样似乎太差强人意了.delphi ...

  6. 浅议Delphi中的Windows API调用(举的两个例子分别是String和API,都不错,挺具有代表性)

    浅议Delphi中的Windows API调用http://tech.163.com/school • 2005-08-15 10:57:41 • 来源: 天极网为了能在Windows下快速开发应用程 ...

  7. 写了一个Windows API Viewer,提供VBA语句的导出功能。提供两万多个API的MSDN链接内容的本地查询

    始出处:http://www.cnblogs.com/Charltsing/p/APIViewer.html QQ:564955427,QQ群:550672198 世面上的API Viewer已经不少 ...

  8. 我的第一个 Windows 窗口程序(1)

    一般来说,构建一个 Windows 程序可以分为如下几个步骤: 定义窗口类(WNDCLASS) 注册窗口类(RegisterClass) 创建窗口(CreateWindow) 更新显示窗口(Updat ...

  9. mfc 调用Windows的API函数实现同步异步串口通信(源码)

    在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半 ...

随机推荐

  1. Azure ASM到ARM迁移 (三) Reserved IP的迁移

    Azure的ASM下,很多用户的应用种域名的解析在DNS服务器种都采用A记录的方式,所以很多用户都在Azure上采用了Reserved IP. 关于Reserved IP,可以参考http://www ...

  2. Mycat-server-1.6.5 常见分片方式

    Mycat-server-1.6.5 常见分片方式 1 安装 [root@hongquan1 soft]# tar zxvf Mycat-server-1.6.5-release-2018012222 ...

  3. c# webapi2 实用详解

    本文介绍webapi的使用知识 发布webapi的问题 配置问题 webapi的项目要前端访问,需要在web.config配置文件中添加如下配置 在system.webServer节点下面添加 < ...

  4. 2016.7.10 SqlServer语句中类似decode、substr、instr、replace、length等函数的用法

    Decode() 对应 case when函数 case CHARINDEX('/',start_point_name) when 0 then start_point_name else subst ...

  5. 第十三章 Spring框架的设计理念与设计模式分析(待续)

    Spring的骨骼架构 核心组件详解 Spring中AOP的特性详解 设计模式解析之代理模式 设计模式解析之策略模式

  6. Eloquent ORM模型中添加自定义值

    我们都知道通过Laravel中数据库查询出来的模型对象都是基于数据库字段,今天给大家展示一个 Laravel Eloquent ORM 模型特性-附加值不存在于数据表中. 举个简单的栗子,一篇文章(p ...

  7. Eclipse中Next Difference的快捷键

    原文:http://stackoverflow.com/questions/10177460/is-there-a-key-binding-for-next-difference-and-previo ...

  8. C语言学习笔记--动态库和静态库的使用

    1.C语言中的链接器 (1)每个 C 语言源文件被编译后生成目标文件,这些目标文件最终要被链接在一起生成可执行文件. (2)链接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正 ...

  9. mysql show status 参数解析

    状态名 作用域 详细解释 Aborted_clients Global 由于客户端没有正确关闭连接导致客户端终止而中断的连接数 Aborted_connects Global 试图连接到MySQL服务 ...

  10. 《Android应用性能优化》 第6章 性能评测和剖析

    1.时间测量 System.currentTimeMillis 精读和准确度可能不够:更改系统时间会影响结果:UTC时间1970/1/1 00:00:00到现在的毫秒数 System.nanoTime ...