《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除了定义一个应用程序的特性及行为外,另一个重要的使命就是封装以上
的那些令人讨厌的、繁琐的步骤。
 
呵,也就是用api来写windows程序。
 
说老实话,与你合作的出版社速度实在不好恭维,个人认为时间的拖延至少使你损失2成(经济上和其他方面)
 
老大最近去哪里了?
好想见到你的书啊
 
不知道国庆后能不能出书?
我觉得用delphi写一些底层的程序,对于了解Vcl更有帮助。不知道大家同意否?
 
good
我又学了一招
原来在控制台下编程这么麻烦,呵呵
真的很期待你的书
 
这些内容好象
在那见过
对了,应该是Delphi2大全这本书
好象是9x年出版的书
也许作者写这本书太勉强了
还没看书,只是看了部份内容后的个人感觉
 
不错啊,你是<<WINDOWS 程序设计>>的DELPHI版呢
 
刚才我已经买到啦,确实不错~
 
早买了看完了,谢谢楼主,收获颇丰, 不过好多地方可以再讲的深入一点。有点虎头蛇尾了。
 
真要这样干的话要DELPHI干嘛,用C得了。Delhpi的.h文件有些不好
 
网上哪儿有?
 
多人接受答案了。
 
顶部