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

2021-04-17 06:38:34 字數 3456 閱讀 3811

接觸delphi

也已經有好長時間了,使用delphi

進行程式開發非常方便、快速,delphi

本身就提供了大量的元件(網上還有更多的元件)進行程式開發,這大大減輕了程式設計師的工作量,但是越方便越說明delphi

本身在背後為我們做的工作就越多,也許很多人沒有考慮過這些,還在充分的享受著它帶給我們的快捷與方便。我也是個c的愛好者,學習和使用c也有好長一段時間了,學了c/c++以後,要進行windows

程式設計,常規的有兩種方法一種是利用sdk

開發包,還有就是mfc,現在還有bcb,等等更多,當時很多人都把sdk

作為乙個基礎,無論怎樣都要或多或少的了解一些,然後在逐步走向mfc,儘管是這樣,不難發現後一種方法是前一種方法的改進,有一種逐步提高的感覺,mfc是對api的一種封裝而已,給程式開發帶來了巨大的方便。

有一本書《windows

程式設計》可以說是一本經典之作,我想很多人都有這套書,書上第乙個完整的例子就是hello,world,乙個簡單的窗體,有著windows

窗體的一般特徵,但是寫了很多**。但是學完了pascal語法,使用delphi

進行windows

程式設計好像是一下子就跳到了使用vcl,對於什麼訊息迴圈,訊息處理,絲毫沒有涉及到,很多參考書也沒有提到這些,對於我的感覺好像就是c/c++天生就是用來開發windows

程式的,無縫連線,pascal的語法是有一點怪怪的,好像不適合(一開始給我的感覺就是不可以)配合sdk

進行windows

程式開發,後來查了一點資料,逐漸摸索,找到了一點眉目,希望能夠和大家共同進步。這個例子可以說是charles例子的乙個轉殖,只是語法換成了pascal而已,在這裡也同樣有訊息迴圈,訊息處理,等等。下面給出這個程式的具體**還有詳細的注釋,為了閱讀的關係我分成了幾個處理函式,都有特殊的註明。

program project2;

uses

windows,

messages;

varmsg:tmsg;

wc:twndclass;//registerclass()所需要的引數

hwnd:thandle;//主窗體的控制代碼

const

classname='mainwclass';

outtext='hello ';

function mainwndproc(handle:thandle;msgid:uint;wparam,lparam:integer):lresult;stdcall;

varpdc: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;

//初始化,註冊視窗類

begin

//首先使用registerclass()註冊窗體類,這可不是delphi

資料型別中的類哦

wc.style:=cs_hredraw or cs_vredraw;

wc.lpfnwndproc:=@mainwndproc;//訊息處理函式的位址

wc.hinstance:=hinstance;//程式的控制代碼,同時也是基位址

wc.hcursor:=loadcursor(0,idc_arrow); //圖示

wc.hbrbackground:=getstockobject(white_brush);//背景畫刷

wc.lpszclassname:=classname;//前面定義的常量

result:=boolean(registerclass(wc));//註冊這個視窗類

end;

//initinstance 生成視窗

function initinstance(hinstance:thandle;ncmdshow:integer):boolean;

begin

hwnd:=createwindowex(0,

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

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

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 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

程式開發的話,會對上面的**非常熟悉,不錯確實是大同小異,只是很多變數的定義和寫法有點差別,還有就是函式呼叫時候有一些注意點。

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

使用markdown編寫部落格

本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...

使用IDLE編寫Python

idle python gui 是乙個功能完備的 ide,允許你再這個ide中編寫 另外還有乙個python shell python的互動模式 可以在其上面進行程式設計練習 idle提供了大量的特性 1.tab鍵自動補全 先輸入前面幾個字母,然後按下tab鍵,idle會自動匹配 2.回退 語句 組...

使用SharePoint CSOM 編寫高效的程式

在上文中的例子,需要返回web物件資訊的時候,我們使用了如下的 var web clientcontext.web clientcontext.load web 設定查詢資訊 進行查詢web的資訊,這時候,web會返回很多屬性,很多是我們不需要的,如果我們只需要返回某些屬性的時候,我們可以使用如下的...