接觸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會返回很多屬性,很多是我們不需要的,如果我們只需要返回某些屬性的時候,我們可以使用如下的...