使用Delphi,SDK編寫Windows簡單程式 (轉)

worldblog發表於2007-12-13
使用Delphi,SDK編寫Windows簡單程式 (轉)[@more@] 

  接觸也已經有好長時間了,使用Delphi進行開發非常方便、,Delphi本身就提供了大量的(網上還有更多的元件)進行程式開發,這大大減輕了程式設計師的工作量,但是越方便越說明Delphi本身在背後為我們做的工作就越多,也許很多人沒有考慮過這些,還在充分的享受著它帶給我們的快捷與方便。我也是個C的愛好者,學習和使用C也有好長一段時間了,學了C/C++以後,要進行,常規的有兩種方法一種是利用SDK開發包,還有就是MFC,現在還有BCB,等等更多,當時很多人都把SDK作為一個基礎,無論怎樣都要或多或少的瞭解一些,然後在逐步走向MFC,儘管是這樣,不難發現後一種方法是前一種方法的改進,有一種逐步提高的感覺,MFC是對的一種封裝而已,給程式開發帶來了巨大的方便。

  有一本書《Windows程式設計》可以說是一本經典之作,我想很多人都有這套書,書上第一個完整的例子就是Hello,world,一個簡單的窗體,有著Windows窗體的一般特徵,但是寫了很多程式碼。但是學完了Pascal語法,使用Delphi進行Windows程式設計好像是一下子就跳到了使用VCL,對於什麼訊息迴圈,訊息處理,絲毫沒有涉及到,很多參考書也沒有提到這些,對於我的感覺好像就是C/C++天生就是用來開發Windows程式的,無縫連線,Pascal的語法是有一點怪怪的,好像不適合(一開始給我的感覺就是不可以)配合SDK進行Windows程式開發,後來查了一點資料,逐漸摸索,找到了一點眉目,希望能夠和大家共同進步。這個例子可以說是Charles例子的一個克隆,只是語法換成了Pascal而已,在這裡也同樣有訊息迴圈,訊息處理,等等。下面給出這個程式的具體程式碼還有詳細的註釋,為了閱讀的關係我分成了幾個處理,都有特殊的註明。

  具體開始的時候也是new一個Application然後關掉預設給我們加的視窗還有程式碼視窗當顯示提示是否要儲存的時候選擇否,然後在project中選擇view 選項,跳到程式碼視窗,修改其中程式碼。

:namespace prefix = o ns = "urn:schemas--com::office" />

program Project2;

uses

  Windows,

  Messages;

var

  Msg:TMsg;

  wc:TWndClass;  //RegisterClass()所需要的引數

  hWnd:THandle;  //主窗體的控制程式碼

  const

  ClassName='MainWClass';

  OutText='Hello ';

Function MainWndProc(Handle:THandle;MsgID:UINT;wParam,lParam:Integer):LRESULT;stdcall;

var

  pDC:HDC;

  lpRect:TRECT;

begin

  Result:=1;

  case MsgID of

  WM_CLOSE:

  begin  //關閉窗體所產生的訊息

  if MessageBox(Handle,'要關閉這個程式嗎?','程式示例',MB_ICONQUESTION or MB_YESNO)=IDYES then

  DestroyWindow(hWnd)

  else

  Result:=0;

  Exit;

  end;

  WM_DESTROY:  //DestroyWindow()所產生的訊息

  begin

  PostQuitMessage(0);

  end;

  WM_PAINT:

  begin

  pDC:=GetDC(hWnd);

  GetClientRect(hWnd,lpRect);

  DrawText(pDC,OutText,5,lpRect,DT_SINGLELINE or DT_CENTER or DT_VCENTER);

  //TextOut(pDC,10,10,OutText,5);

  ReleaseDC(hWnd,pDC);

  end;

  end;

//剩下的訊息交給Windows預設的處理函式就可以了,比如畫窗體的WM_NCPAINT訊息等等

  Result:=DefWindowProc(Handle,MsgID,wParam,lParam);

end;

//初始化,註冊視窗類

Function InitApplication(hInstance:THANDLE):Boolean;

begin

  //首先使用RegisterClass()註冊窗體類,這可不是Delphi資料型別中的類哦

  wc.style:=CS_HREDRAW OR CS_VREDRAW;

  wc.lpfnWndProc:=@MainWndProc;  //訊息處理函式的地址

  wc.hInstance:=hInstance;  //程式的控制程式碼,同時也是基地址

  wc.hIcon:=LoadIcon(0,PChar(IDI_APPLICATION));

  wc.hCursor:=LoadCursor(0,IDC_ARROW); //圖示

  wc.hbrBackground:=GetStock(WHITE_BRUSH);  //背景畫刷

  wc.lpszClassName:=ClassName;  //前面定義的常量

  Result:=Boolean(RegisterClass(wc));//註冊這個視窗類

end;

//InitInstance 生成視窗

Function InitInstance(hInstance:THANDLE;nCmdShow:Integer):Boolean;

begin

  hWnd:=CreateWindowEx(0,

  ClassName, //剛才註冊的類的名字

  '示例',  //窗體的標題

  WS_OVERLAPPEDWINDOW,  //窗體的型別,有標題欄、選單、最大化最小化選單,以及拉伸邊框

  Integer(CW_USEDEFAULT),

  Integer(CW_USEDEFAULT),

  Integer(CW_USEDEFAULT),

  Integer(CW_USEDEFAULT),

   0,

  0,

  hInstance,

  nil

  );

  if hWnd=0 then

  begin

  Result:=false;

  Exit;

  end;

  ShowWindow(hWnd,CmdShow);

  UpdateWindow(hWnd);

  Result:=true;

end;

//主程式開始

begin

  if Not InitApplication(hInstance) then Halt(0); //初始化註冊視窗類

  if Not InitInstance(hInstance,CmdShow) then Halt(0);  //產生視窗

  while GetMessage(Msg,0,0,0) do

  begin

  TranslateMessage(Msg);

  DispatchMessage(Msg);  //該API將訊息分派到相應的窗體訊息處理函式

  end;

  ExitCode:=Msg.wParam;

end.

  上面給出了詳細的程式碼,其中借鑑了有關文章,這就是最基本的,如果使用C進行過Windows程式開發的話,會對上面的程式碼非常熟悉,不錯確實是大同小異,只是很多變數的定義和寫法有點差別,還有就是函式時候有一些注意點。

  我比較喜歡和大家一起討論,喜歡追究個所以然,希望各位能夠和我一起討論,一起進步。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992478/,如需轉載,請註明出處,否則將追究法律責任。

相關文章