Delphi下用WindowsAPI建立窗體

2021-03-31 08:56:29 字數 4155 閱讀 4273

//   delphi 下呼叫windows api 建立窗體.       //

//  模板-------by hottey 2004-4-13-0:18       //

//  作者**:

//視窗訊息處理函式.

function mywinproc(hwnd:thandle;umsg:uint;wparam,lparam:cardinal):cardinal;exp

ort;stdcall;

var 

hdca,hdcb:thandle;         //裝置描述表控制代碼.

rect:trect;                //矩形結構.

font:hfont;

ps:tpaintstruct;           //繪圖結構.

begin

result:=0;

case umsg of

wm_paint:

begin

hdca:=beginpaint(hwnd,ps);

setbkmode(hdca, transparent);

setbkcolor(hdca,getbkcolor(hdca));

getclientrect(hwnd,rect);      //獲取視窗客戶區的尺寸.

drawtext(hdca,pchar(hellostr),-1,rect,dt_singleline or dt_center or dt

_vcenter);

//      textout(hdc,100,40,hellostr,length(hellostr));

endpaint(hwnd,ps);

end;

wm_create:

begin

hdcb  := getdc(hwnd);

font  := createfont(45, 0, 0, 0, fw_normal, 0, 0, 0, ansi_charset, out

_default_precis, clip_default_precis,

default_quality, 34, pchar('arial'));

selectobject(hdcb, font);

releasedc(hwnd, hdcb);

end;

wm_destroy:

postquitmessage(0)

else

//使用預設的視窗訊息處理函式.

result:=defwindowproc(hwnd,umsg,wparam,lparam);

end;

end;

//主程式開始.

var

msg        :tmsg;          //訊息結構.

hwnd,hinst :thandle;       //windows 視窗控制代碼.

winclass   :twndclas***;   //windows 視窗類結構.

begin

winclass.cbsize:=sizeof(twndclas***);

winclass.lpszclassname:='mywindow';         //類名.

winclass.style:=cs_hredraw or cs_vredraw or cs_owndc;

winclass.hinstance:=hinst;              //程式的例項控制代碼.

//設定視窗訊息處理函式.

winclass.lpfnwndproc:=@mywinproc;           //視窗過程.

winclass.cbcl***tra:=0;                     //以下兩個域用於在類結構和window

s內部儲存的視窗結構

winclass.cbwndextra:=0;                     //中預留一些額外空間.

winclass.hicon:=loadicon(hinstance,makeintresource('mainicon'));

winclass.hicon**:=loadicon(hinstance,makeintresource('mainicon'));

winclass.hcursor:=loadcursor(0,idc_arrow);

//getstockobject 獲取乙個圖形物件,在這裡是獲取繪製視窗背景的刷子,返回乙個白色刷

子的控制代碼.

winclass.hbrbackground:=hbrush(getstockobject(white_brush));

winclass.lpszmenuname:=nil;                 //指定視窗類選單.

//向windows 註冊視窗類.

if registerclas***(winclass)=0 then

begin

messagebox(0,'registeration error!','sdk/api',mb_ok);

exit;

end;

//建立視窗物件.

hwnd:=createwindowex(

winclass.lpszclassname,                 //類名.

'hello window',                         //視窗標題.

cw_usedefault,                          //視窗左上角相對於螢幕

左上角的初始位置x.

0,                                      //....右y.

cw_usedefault,                          //視窗寬度x.

0,                                      //視窗高度y.

0,                                      //父視窗控制代碼.

0,                                      //視窗選單控制代碼.

hinst,                                  //程式例項控制代碼.

nil);                                   //建立引數指標.

if hwnd<>0 then

begin

showwindow(hwnd,sw_shownormal);        //顯示視窗.

updatewindow(hwnd);                    //指示視窗重新整理自己.

setwindowpos(hwnd, hwnd_topmost, 0, 0, 0, 0, swp_nomove + swp_nosize);

end

else

messagebox(0,'window not created!','sdk/api',mb_ok);

//主訊息迴圈程式.  

while getmessage(msg,0,0,0) do

begin

translatemessage(msg);                   //轉換某些鍵盤訊息.

dispatchmessage(msg);                    //將訊息傳送給視窗過程.

end;

end.

>其實windows 程式設計是每個學寫程式的人都要掌握的,學delphi時也最好能先學習windos編

程(最少要知道).以上**雖說不如在delphi中直接來個new->form來的快,但它能告訴你本

質的東西.能讓你更好的了解訊息迴圈以及其他.而這些正是讓new出來的窗體給掩蓋的部分 .

>注:以上**是我從windows 程式設計上通過c++語法直譯過來的(),測試後沒有問題.若我

的註解有什麼錯誤的地方,請各位指正!^_^

hottey 於2004-5-19

作者**:

http://asp.itdrp.***/hottey  (附例程)

Delphi下深入Windows核心程式設計

目錄 第1章 dll與資料共享 1.1 關於dll 1.1.1 dll的結構 1.1.2 dll資料作用範圍 1.2 記憶體映像 1.2.1 建立映像檔案 1.2.2 開啟映像檔案 1.2.3 對映到本程序中 1.2.4 關閉記憶體對映 1.2.5 兩個exe檔案共享記憶體資料塊 1.2.6 兩個d...

DELPHI下的WINDOWS訊息傳遞機制

blog開了很久,專業的東西一點沒寫,今天既然已經坐下了,就寫點東西吧,也算調整調整心緒!開發基於windows平台的應用程式時,了解windows訊息系統組成是非常必要的。訊息本身是作為乙個記錄傳遞給應用程式的,記錄中包含訊息的型別以及其它的資訊!這個記錄型別叫做tmsg,它在windows單元中...

delphi下 用assert來完成錯誤的捕捉

assert 過程原形 code procedure assert expr boolean const msg string code 在system.pas 裡 assert 的實現是 procedure assert const message,filename ansistring line...