1、大致說來windows編程有兩種方法:
a.windwos c方式(SDK),SDK編程就是直接調(diào)用windows的API進行編程;
b.c++方式:即對SDK函數(shù)進行包裝,如VC的MFC,BCB的OWL等。MFC把這些API封閉起來,共有一百多個類組成.
2、API,全稱application program interface,意思是應(yīng)用程序編程接口(說起API并不僅僅指windows而言, windows支持的API叫winapi)。winapi就是應(yīng)用程序和windows之間通訊的一個編程界面。windows提供了上千個API函數(shù),以方便程序員來編寫應(yīng)用程序。
3、WinSDK程序設(shè)計就是API方式的windows程序設(shè)計。SDK,全稱Software Developers Kit,意思是軟件開發(fā)工具箱。
4、MFC,全稱Microsoft Foundation Classes,偽軟把WinAPI進行封裝的類庫。它是一個類的集合,通過覆蓋WinAPI,為編程提供了一個面向?qū)ο蟮慕缑?。它使windows程序員能夠利用C++面象對象的特性進行編程,類似BCB的OWL,Delphi的VCL組件。它把那些進行SDK編程時最繁瑣的部分提供給程序員,使之專注于功能的實現(xiàn)。你不妨把它想象成類似TC提供的函數(shù)庫吧。
5、dos下的C編程的main()一樣,windows下的入口是WinMain()函數(shù)。
6、WinMain()所起的作用:初始化,展示,銷毀應(yīng)用程序等。
第一個參數(shù):應(yīng)用程序的當前實例句柄。
第二個參數(shù):應(yīng)用程序的前一個實例句柄,別管它,對于Win32位而言,它一般是NULL.
第三個參數(shù):指向任何傳給程序的命令行參數(shù)。PSTR代表"指向字符串的指針"。
第四個參數(shù):它告訴應(yīng)用程序如何初始化窗口,如最大化,最小化等狀態(tài)。
7、句柄(handle):
在標準C庫中句柄用來對文件輸入輸出。
在Windows環(huán)境中,句柄是用來標識項目的,這些項目包括:
*.模塊(module)
*.任務(wù)(task)
*.實例(instance)
*.文件(file)
*.內(nèi)存塊(block of memory)
*.菜單(menu)
*.控制(control)
*.字體(font)
*.資源(resource),包括圖標(icon),光標(cursor),字符串(string)等
*.GDI對象(GDI object),包括位圖(bitmap),畫刷(brush),元文件(metafile),調(diào)色板(palette),畫 筆(pen),區(qū)域(region),以及設(shè)備描述表(device context)。
WINDOWS程序中并不是用物理地址來標識一個內(nèi)存塊,文件,任務(wù)或動態(tài)裝入模塊的,相反的,WINDOWS API給這些項目分配確定的句柄,并將句柄返回給應(yīng)用程序,然后通過句柄來進行操作。
窗口句柄:
系統(tǒng)通過窗口句柄來在整個系統(tǒng)中唯一標識一個窗口,發(fā)送一個消息時必須指定一個窗口句柄表明該消息由那個窗口接收。而每個窗口都會有自己的窗口過程,所以用戶的輸入就會被正確的處理。
8、所有的命名采用了匈牙利表示法。如消息的前綴使用msg.句柄使用h.函數(shù)使用fn等。
9、MainFrm.cpp、MainFrm.h:
這兩個文件將從CFrameWnd(SDI應(yīng)用程序)或CMDIFrameWnd(MDI應(yīng)用程序)派生CMainFrame類。如果在AppWizard的Application Options頁(6步中的第4步)中選擇了對應(yīng)的可選項的話,CMainFrame類將處理工具條按鈕和狀態(tài)條的創(chuàng)建。MAINFRM.CPP文件還含有MFC應(yīng)用程序提供的默認工具條按鈕的對象ID——叫做buttons數(shù)組。
10、DOS程序主要使用順序的,過程驅(qū)動的程序設(shè)計方法。順序的,過程驅(qū)動的程序有一個明顯的開始,明顯的過程及一個明顯的結(jié)束,因此程序能直接控制程序事件或過程的順序。雖然在順序的過程驅(qū)動的程序中也有很多處理異常的方法,但這樣的異常處理也仍然是順序的,過程驅(qū)動的結(jié)構(gòu)。
11、Windows的驅(qū)動方式是事件驅(qū)動,就是不由事件的順序來控制,而是由事件的發(fā)生來控制,所有的事件是無序的。做為一個程序員,在你編寫程序時,你并不知道用戶先按哪個按紐,也不知道程序先觸發(fā)哪個消息。你的任務(wù)就是對正在開發(fā)的應(yīng)用程序要發(fā)出或要接收的消息進行排序和管理。事件驅(qū)動程序設(shè)計是密切圍繞消息的產(chǎn)生與處理而展開的,一條消息是關(guān)于發(fā)生的事件的消息。
12、Windows程序則至少兩個主程序,
一個是WinMain(),
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
);
另一個是窗口過程函數(shù)WndProc,它的函數(shù)原型為:
long FAR PASCAL WndProc(HWND hWnd,WORD message,WORD wParam,LONG lParam);
13、窗口函數(shù)與回調(diào)函數(shù):
在Windows中,應(yīng)用程序通過要求Windows完成指定操作,而承擔這項通信任務(wù)的API函數(shù)就是Windows的相應(yīng)窗口函數(shù)WndProc。應(yīng)用程序不直接調(diào)用任何窗口函數(shù),而是等待Windows調(diào)用窗口函數(shù),請求完成任務(wù)或返回信息。為保證Windows調(diào)用這個窗口函數(shù),這個函數(shù)必須先向Windows登記,然后在Windows實施相應(yīng)操作時回調(diào),所以窗口函數(shù)又稱為回調(diào)函數(shù)。WndProc是一個主回調(diào)函數(shù),Windows至少有一個回調(diào)函數(shù)。典型的回調(diào)函數(shù)有窗口過程、對話框過程和鉤子函數(shù)。實際上,也許有不止一個的窗口過程。例如,每一個不同的窗口類都有一個與之相對應(yīng)的窗口過程。
15、實例:在Windows中,能多次同時運行同一個應(yīng)用程序,即運行多個副本,每個副本叫做一個“實例”。
16、C runtime函數(shù)庫:
就跟它的名字一樣,運行類型信息
主要有COject類和CRuntimeClass類來實現(xiàn),用來存貯COject類和派生類的運行類型信息,
1.類的基本情況:如類的名字,存貯空間大小,用于運行類的類型確定.
2.ms在C++的標準上,添加動態(tài)創(chuàng)建的類對象功能,也就是時時提到的動態(tài)創(chuàng)建
3.串行化處理.
The OS does not know main(), so C-runtime is first called and transfer control to main
it also provide library for common usage, such as math functions
17、WinMain()函數(shù)的調(diào)用約定是PASCAL。
在這里PASCAL是一個調(diào)用約定,由于這種方式最早由PASCAL采用,所以這么叫。
在MSDN中的C++ Language Reference中,Calling Conventions這一章都是講調(diào)用約定的。
約定:微軟重定義了許多約定類型,為的是可以讓代碼更容易跨平臺或者跨編譯器。
其實,調(diào)用約定要解決兩個問題,都是針對堆棧操作:
1。參數(shù)傳遞的順序(本質(zhì)是壓棧的順序)
2。誰負責(zé)平棧(調(diào)用者還是調(diào)用對象)
一個函數(shù)的聲明、定義和實現(xiàn)中的調(diào)用方式一般都一致。
WINAPI標識符的定義是:#define WINAPI __stdcall, __stdcall指Window調(diào)用函數(shù)的一種方式,也就是如何在堆中存取函數(shù)參數(shù)的方式。許多Windows Api函數(shù)調(diào)用聲明為__stdcall方式。
18、用位的“或”操作(操作符“|”)把若干個常數(shù)組合起來控制消息窗口顯示的按鈕和圖標等。
19、在Windows應(yīng)用程序中,每一個窗口都必須從屬于一個窗口類,窗口類定義了窗口所具有的屬性,如它的樣式、圖標、鼠標指針、菜單名稱及窗口過程名等。
窗口種類是定義窗口屬性的模板,這些屬性包括窗口式樣,鼠標形狀,菜單等等,窗口種類也指定處理該類中所有窗口消息的窗口函數(shù).只有先建立窗口種類,才能根據(jù)窗口種類來創(chuàng)建Windows應(yīng)用程序的一個或多個窗口.創(chuàng)建窗口時,還可以指定窗口獨有的附加特性.窗口種類簡稱窗口類,窗口類不能重名.在建立窗口類后,必須向Windows登記.建立窗口類就是用WNDCLASS結(jié)構(gòu)定義一個結(jié)構(gòu)變量.
20、Visual C++提供Alt+F8功能鍵,進行文件規(guī)格化,根據(jù)周圍的代碼行,正確縮進選定的代碼行。常使用該按鍵可使得文件保持規(guī)格化(注,Alt+F8功能鍵對連續(xù)兩個CASE語句則會發(fā)生處理錯誤,不能規(guī)格化)。
21、消息:
一個消息由一個消息名稱(UINT),和兩個參數(shù)(WPARAM,LPARAM)。當用戶進行了輸入或是窗口的狀態(tài)發(fā)生改變時系統(tǒng)都會發(fā)送消息到某一個窗口。
22、一個典型的應(yīng)用程序應(yīng)該活動在稱為“框架窗口”中。一個框架窗口是一個全功能的主窗口,用戶可以改變尺寸、最小化、最大化等。
23、消息機制:
系統(tǒng)將會維護一個或多個消息隊列,所有產(chǎn)生的消息都回被放入或是插入隊列中。系統(tǒng)會在隊列中取出每一條消息,根據(jù)消息的接收句柄而將該消息發(fā)送給擁有該窗口的程序的消息循環(huán)。每一個運行的程序都有自己的消息循環(huán),在循環(huán)中得到屬于自己的消息并根據(jù)接收窗口的句柄調(diào)用相應(yīng)的窗口過程。而在沒有消息時消息循環(huán)就將控制權(quán)交給系統(tǒng)所以Windows可以同時進行多個任務(wù)。
24、預(yù)編譯頭文件:
VC++程序一般包含的頭文件都比較復(fù)雜,如果每次都逐行分析可能會花很多時間,所以VC++默認設(shè)置是第一次編譯時分析所有頭文件,生成.pch文件,這個文件很大,但以后每次編譯時就可以節(jié)省很多時間。如果刪除了這個文件,下次編譯時VC++會自動生成它。
StdAfx.h是每個MFC程序的類中必須包括的文件,它一般由AppWizard自動生成,包括編譯MFC類所必須的定義。
25、Windows支持兩種類型的對話框:模式和無模式對話框。
模式對話框一旦出現(xiàn)在屏幕上,只有當它退出時,屏幕上該應(yīng)用程序的其余部分才能響應(yīng)。
無模式對話框出現(xiàn)在屏幕上時,程序的其余部分也可以作出響應(yīng),它就象浮動在上面一樣。
26、單文檔界面(SDI),只有一個框架窗口。
MDI 系統(tǒng)允許用戶在同一應(yīng)用程序中同時可以查看多個文檔。