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