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

  • 主题发起人 Nicrosoft
  • 开始时间
N

Nicrosoft

Unregistered / Unconfirmed
GUEST, unregistred user!
我知道,朋友们等待这本书很久了,好多朋友都发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除了定义一个应用程序的特性及行为外,另一个重要的使命就是封装以上
的那些令人讨厌的、繁琐的步骤。
 
D

dedema

Unregistered / Unconfirmed
GUEST, unregistred user!
呵,也就是用api来写windows程序。
 
W

wsn

Unregistered / Unconfirmed
GUEST, unregistred user!
说老实话,与你合作的出版社速度实在不好恭维,个人认为时间的拖延至少使你损失2成(经济上和其他方面)
 
W

wr960204

Unregistered / Unconfirmed
GUEST, unregistred user!
老大最近去哪里了?
好想见到你的书啊
 
X

xieha

Unregistered / Unconfirmed
GUEST, unregistred user!
不知道国庆后能不能出书?
我觉得用delphi写一些底层的程序,对于了解Vcl更有帮助。不知道大家同意否?
 

佛法无边

Unregistered / Unconfirmed
GUEST, unregistred user!
good
我又学了一招
原来在控制台下编程这么麻烦,呵呵
真的很期待你的书
 
P

pjp2000delphi

Unregistered / Unconfirmed
GUEST, unregistred user!
M

morgan

Unregistered / Unconfirmed
GUEST, unregistred user!
这些内容好象
在那见过
对了,应该是Delphi2大全这本书
好象是9x年出版的书
也许作者写这本书太勉强了
还没看书,只是看了部份内容后的个人感觉
 
C

cocoboy79

Unregistered / Unconfirmed
GUEST, unregistred user!
不错啊,你是<<WINDOWS 程序设计>>的DELPHI版呢
 
Y

ymf

Unregistered / Unconfirmed
GUEST, unregistred user!
刚才我已经买到啦,确实不错~
 
C

coolmoon007

Unregistered / Unconfirmed
GUEST, unregistred user!
S

satanmonkey

Unregistered / Unconfirmed
GUEST, unregistred user!
早买了看完了,谢谢楼主,收获颇丰, 不过好多地方可以再讲的深入一点。有点虎头蛇尾了。
 
W

Wjzhou

Unregistered / Unconfirmed
GUEST, unregistred user!
真要这样干的话要DELPHI干嘛,用C得了。Delhpi的.h文件有些不好
 
3

3cs

Unregistered / Unconfirmed
GUEST, unregistred user!
网上哪儿有?
 
N

Nicrosoft

Unregistered / Unconfirmed
GUEST, unregistred user!
多人接受答案了。
 
顶部