来源:www.cncfan.com | 2006-1-12 | (有2086人读过)
我想读者有必要先了解一个标准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除了定义一个应用程序的特性及行为外,另一个重要的使命就是封装以上 的那些令人讨厌的、繁琐的步骤。
|