程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 《Delphi高手突破》節選--脫離VCL的Windows程序

《Delphi高手突破》節選--脫離VCL的Windows程序

編輯:Delphi

我知道,朋友們等待這本書很久了,好多朋友都發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除了定義一個應用程序的特性及行為外,另一個重要的使命就是封裝以上的那些令人討厭的、繁瑣的步驟。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved