《Delphi高手突破》节选--脱离VCL的Windows程序

原创 2002年09月30日 12:00:00

我知道,朋友们等待这本书很久了,好多朋友都发Email来问。出版社现在说,10月中旬可以上市。上市最快的,应该是网络上的销售,然后,常规渠道来说,北京应该比其他区域快。

在此,再贴出一段节选。

书的支持网站:http://www.sunistudio.com/nicrosoft/book/did/
光盘内容下载暂时不提供。

谢谢!

-----------------------------------------------
4.4.1 脱离VCL的Windows程序
我想读者有必要先了解一个标准Windows程序的运行流程,如果您还不了解,请看下面的一个示例程序。在此,我给出一个用纯pascal所编写的十分简单的Windows应用程序,以演示标准Windows程序是如何被建立及运行的。该程序的代码及可执行文件可在本书配套光盘的WindowDemo目录下找到,程序可被Delphi编译通过。
以下是代码清单,请注意其中的注释:
program WindowDemo;

uses Windows, Messages;

// 窗口函数,窗口接到消息时被Windows所调用
function WindowProc(hwnd : HWND; uMsg : Cardinal; wParam : WPARAM;
 lParam : LPARAM) : LResult; stdcall;
begin
 Result := 0;
   
 case uMsg of
 // 关闭窗口消息,当用户关闭窗口后,通知主消息循环结束程序
 WM_CLOSE : PostMessage(hwnd, WM_QUIT, 0, 0);
 // 鼠标左键按下消息
 WM_LBUTTONDOWN : MessageBox(hwnd, 'Hello!', '和您打个招呼',
  MB_ICONINFORMATION);

 else
 // 其它消息做默认处理
  Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
 end;
end;

var
 wndcls : WNDCLASS; // 窗口类的记录(结构)类型
 hWnd : THandle;
 Msg : tagMSG; // 消息类型
begin
 wndcls.style := CS_DBLCLKS; // 允许窗口接受鼠标双击
 wndcls.lpfnWndProc := @WindowProc; // 为窗口类指定窗口函数
 wndcls.cbClsExtra := 0;
 wndcls.cbWndExtra := 0;
 wndcls.hInstance := hInstance;
 wndcls.hIcon := 0;
 wndcls.hCursor := LoadCursor(hInstance, 'IDC_ARROW');
 wndcls.hbrBackground := COLOR_WINDOWFRAME;
 wndcls.lpszMenuName := nil;
 wndcls.lpszClassName := 'WindowClassDemo'; // 窗口类名称

 // 注册窗口类
 if RegisterClass(wndcls) = 0 then
  Exit;
  
 // 创建窗口
 hWnd := CreateWindow(
  'WindowClassDemo', // 窗口类名称
  'WindowDemo', // 窗口名称
  WS_BORDER or WS_CAPTION or WS_SYSMENU, // 窗口类型
  Integer(CW_USEDEFAULT),
  Integer(CW_USEDEFAULT),
  Integer(CW_USEDEFAULT),
  Integer(CW_USEDEFAULT),
  0,
  0,
  hInstance,
  nil
 );
 if hWnd = 0 then
  Exit;

 // 显示窗口
 ShowWindow(hWnd, SW_SHOWNORMAL);
 UpdateWindow(hWnd);

 // 创建主消息循环,处理消息队列中的消息并分发
 // 直至收到WM_QUIT消息,退出主消息循环,并结束程序
 // WM_QUIT消息由PostMessage()函数发送
 while GetMessage(Msg, hWnd, 0, 0) do
 begin
  TranslateMessage(Msg);
  DispatchMessage(Msg);
 end;
end.
该程序没有使用VCL,它所做的事情就是显示一个窗口,当你在窗口上单击鼠标右键时弹出一个友好的对话框向您问好。如果您从来不曾了解过这些,那么我建议您实际运行一下光盘上的这个程序,对其多一些感性认识。
就是这样一个简单的程序,演示了标准Windows程序的流程:
1、从入口函数WinMain开始
2、注册窗口类及窗口函数(Window Procedure)
3、创建并显示窗口
4、进入主消息循环,从消息队列中获取并分发消息
5、消息被分发后,由Windows操作系统调用窗口函数,由窗口函数对消息进行处理。
在Object Pascal中,我们看不到所谓的“WinMain”函数,不过,其实整个program的begin处就是Windows程序的入口。
注册窗口类通过系统API函数RegisterClass()来完成,它向Windows系统注册一个窗口的类型。
注册窗口类型完成后,就可以创建这个类型的窗口实例,创建出一个真正的窗口通过API函数CreateWindow()来实现。
创建出的窗口实例通过API函数ShowWindow()来使得它显示在屏幕上。
当这一切都完成后,窗口开始进入一个while循环以处理各种消息,直至API函数GetMessage()返回0退出程序。循环中,程序需要从主线程的消息队列中取出各种消息,并将它分发给系统,然后由Windows系统调用窗口的窗口函数(WndProc)以完成窗口对消息的响应处理。
也许你会觉得,写一个Windows应用程序原来是那么繁琐的,需要调用大量的API函数来完成平时看起来很简单的事情,而我们平时使用VCL编写窗口应用程序时,似乎从来没有遇到过这些东西。是的,VCL作为一个Framework为我们做了很多事情,其中的TApplication除了定义一个应用程序的特性及行为外,另一个重要的使命就是封装以上的那些令人讨厌的、繁琐的步骤。

《Delphi高手突破》学习笔记(一)

  《Delphi高手突破》据说挺不错,他用面向对象的观点描述了Delphi中的类和VCL架构。  第二章、面向对象编程理论基础设计优良的类的某些共同特征:具有状态信息,接口简单、明了,易用。在OP的...
  • wanshi131
  • wanshi131
  • 2005年11月08日 08:38
  • 1174

《delphi高手突破》节选一

上次贴出新书的第一章,出乎我的意料,反响热烈,得到许多网友的支持。今天完成了第二章的草稿的撰写,在此节选一小段文字,希望继续得到大家的支持,指正。当然,节选的量是非常少的(否则出版社也不答应,呵呵),...
  • Nicrosoft
  • Nicrosoft
  • 2002年02月04日 08:40
  • 1275

《delphi高手突破》节选二

完成了第三章 异常及错误处理,节选一节构造函数与异常这个话题在C++社区中经常会被提起,而在Delphi社区中似乎从来没有人注意过。也许由于语言的特性,使得Delphi程序员不必关心这个问题。但我想D...
  • Nicrosoft
  • Nicrosoft
  • 2002年02月12日 21:26
  • 1360

delphi VCL研究之消息分发机制-delphi高手突破读书笔记

1.VCL 概貌 先看一下VCL类图的主要分支,如图4.1所示。 在图中可以看到,TObject是VCL的祖先类,这也是Object Pascal语言所规定的。但实际上,TObject以及TObj...
  • sushengmiyan
  • sushengmiyan
  • 2013年03月04日 21:36
  • 3297

关于VCL的编写 (一) 怎样编写自己的VCL控件

怎样编写自己的VCL控件       用过Delphi的朋友们,大概对Delphi的最喜欢Delphi的不是他的强类型的pascal语法,而是强大的VCL控件,本人就是一位VCL控件的爱好者。    ...
  • dreamnan
  • dreamnan
  • 2004年09月15日 13:07
  • 2237

Delphi 开源项目 VCL Styles Utils

项目地址:https://code.google.com/p/vcl-styles-utils/ 其功能是对现有的 VCL Style 进行扩展,支持 Delphi XE 2 ~ XE 5!...
  • MaxWoods
  • MaxWoods
  • 2014年03月24日 08:53
  • 2209

Delphi 之 RTL 与 VCL

RTL : Run-Time Library 运行时库, 包括 System, SysUtils, Math 三个单元. 提供的函数与语言, 编译器, 操作系统及进程有关.VCL : Visual C...
  • bambuz
  • bambuz
  • 2011年01月17日 21:00
  • 2293

《Inside VCL(深入核心——VCL架构剖析)》.(李维) 一

一、回到从前:1.1、多任务操作系统是如何设计和实现的? 1.1.1、系统——多个应用程序 方案1:(系统不断读取应用程序状态) 系统通过大型循环(Loop)不断坚持么一个恶用用程序是否触发了特定的事...
  • liang08114
  • liang08114
  • 2016年12月20日 21:03
  • 528

Delphi 2010 DevExpressVCL.13.1.4 安装方法

1.解压DevExpressVCL.13.1.4.7z 如D:\Program Files\DevExpressVCL.13.1.4 2.打开DevExpressVCL一键编译安装工具_2.14(免...
  • hksoobe
  • hksoobe
  • 2014年06月15日 17:21
  • 1475

DevExpress VCL for Delphi 各版本收集下载

DevExpress VCL 5.7:http://www.ctdisk.com/file/7500697(支持XE)   DevExpress VCL 2011 VOL 1.6:http://w...
  • wozengcong
  • wozengcong
  • 2013年10月15日 18:39
  • 4482
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《Delphi高手突破》节选--脱离VCL的Windows程序
举报原因:
原因补充:

(最多只允许输入30个字)