(一)第一个窗口程序
来源:互联网 发布:建筑学需要用的软件 编辑:程序博客网 时间:2024/06/04 08:04
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消息,写自己的逻辑代码!
- (一)第一个窗口程序
- 一、第一个窗口程序
- 第一个窗口程序(一.开始了解窗口)
- 第一个窗口程序
- 第一个窗口程序
- 第一个窗口程序
- 第一个窗口程序(二.分析窗口程序)
- 第一个Win32窗口程序
- 第一个Win32窗口程序
- 第一个Hibernate程序(一)
- 第一个WCF程序(一)
- cocos2D(一)----第一个cocos2D程序
- pyqt5&python3 Gui 入门教程 (一) 第一个窗口
- 一、第一个cocos2d程序
- 一、第一个cocos2d程序
- 一、第一个cocos2d程序
- 一、第一个cocos2d程序
- 一、第一个C程序
- 原生 Hive 1.2.1 的安装
- angular自己最近使用的一种筛选方法
- NMAP分布式扫描工具dnmap
- mybatis系列-动态 SQL(四)
- 使用ffmpeg进行解码的基本流程 和几个重要函数
- (一)第一个窗口程序
- Lintcode(S)落单的数
- 如何查看Eclipse版本
- IOS开发UI篇之──键盘添加工具条
- python如何实现清屏
- 百度一面
- IE兼容border-radius的方法
- 消息与事件、如何快速添加容易忘的消息和事件?
- Redis学习指南一