首頁 考試吧論壇 Exam8視線 考試商城 網絡課程 模擬考試 考友錄 實用文檔 求職招聘 論文下載 | ||
![]() |
2012中考 | 2012高考 | 2012考研 | 考研培訓 | 在職研 | 自學考試 | 成人高考 | 法律碩士 | MBA考試 MPA考試 | 中科院 |
|
![]() |
四六級 | 職稱英語 | 商務英語 | 公共英語 | 托福 | 托業 | 雅思 | 專四專八 | 口譯筆譯 | 博思 GRE GMAT | 新概念英語 | 成人英語三級 | 申碩英語 | 攻碩英語 | 職稱日語 | 日語學習 | 零起點法語 | 零起點德語 | 零起點韓語 |
|
![]() |
計算機等級考試 | 軟件水平考試 | 職稱計算機 | 微軟認證 | 思科認證 | Oracle認證 | Linux認證 華為認證 | Java認證 |
|
![]() |
公務員 | 報關員 | 銀行從業資格 | 證券從業資格 | 期貨從業資格 | 司法考試 | 法律顧問 | 導游資格 報檢員 | 教師資格 | 社會工作者 | 外銷員 | 國際商務師 | 跟單員 | 單證員 | 物流師 | 價格鑒證師 人力資源 | 管理咨詢師 | 秘書資格 | 心理咨詢師 | 出版專業資格 | 廣告師職業水平 | 駕駛員 網絡編輯 | 公共營養師 | 國際貨運代理人 | 保險從業資格 | 電子商務師 | 普通話 | 企業培訓師 營銷師 |
|
![]() |
衛生資格 | 執業醫師 | 執業藥師 | 執業護士 | |
![]() |
會計從業資格考試(會計證) | 經濟師 | 會計職稱 | 注冊會計師 | 審計師 | 注冊稅務師 注冊資產評估師 | 高級會計師 | ACCA | 統計師 | 精算師 | 理財規劃師 | 國際內審師 |
|
![]() |
一級建造師 | 二級建造師 | 造價工程師 | 造價員 | 咨詢工程師 | 監理工程師 | 安全工程師 質量工程師 | 物業管理師 | 招標師 | 結構工程師 | 建筑師 | 房地產估價師 | 土地估價師 | 巖土師 設備監理師 | 房地產經紀人 | 投資項目管理師 | 土地登記代理人 | 環境影響評價師 | 環保工程師 城市規劃師 | 公路監理師 | 公路造價師 | 安全評價師 | 電氣工程師 | 注冊測繪師 | 注冊計量師 化工工程師 | 材料員 |
|
![]() |
繽紛校園 | 實用文檔 | 英語學習 | 作文大全 | 求職招聘 | 論文下載 | 訪談 | 游戲 |
Windows內部運行機制
Windos系統提供了各種各樣的函數,這些函數是windows操作系統提供給應用程序的接口 Application Progress Interface,所有主要的windows函數都在Windows.h頭文件中進行了聲明。
Win32 SDK(Soft Development Kit)是Windows 32平臺下的軟件開發包,包括API函數,幫助文檔和一些輔助開發工具。
Windows是基于消息機制的,消息分標準消息,命令消息和通告消息。Windows程序中的消息又分進隊消息和不進隊消息,兩種消息都由消息響應函數進行處理。
在VC中創建一個win32應用程序的大概流程如下:
編寫WinMain函數;
設計窗口類(WNDCLASS);
注冊窗口類(RegisterClass);
創建窗口(CreateWindow);
顯示并更新窗口(ShowWindow|UpdateWindow);
編寫消息循環;
編寫窗口過程函數。
一個WinMain函數的原型如下:
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
);此處WINAPI是一個_stdcall宏定義,VC有很多宏定義,這個很讓人頭大,需要慢慢去習慣,從網絡上找了2中函數定義的說明與區別解釋。
__cdecl:這是編譯器默認的函數調用轉換方式,它可以處理可變參數的函數調用。參數的入棧順序是從右向左。在函數運行結束后,由調用函數負責清理入棧的參數。在編譯時,在每個函數前面加上下劃線(_),沒有函數名大小寫的轉換。即_functionname.每一個調用它的函數都包含清空堆棧的代碼,所以產生的可執行文件大小會比調用_stdcall函數的大。函數采用從右到左的壓棧方式。
__stdcall:函數參數從右向左入棧,被調用函數負責入棧參數的清理工作。函數名轉換格式如下:_functionname@number.函數參數個數固定。
WINDOWS 的函數調用時需要用到棧( STACK ,一種先入后出的存儲結構)。當函數調用完成后,棧需要清除,這里就是問題的關鍵,如何清除?
如果函數使用 _cdecl ,那么棧的清除工作是由調用者,用 COM 的術語來講就是客戶來完成的。這樣帶來了一個棘手的問題,不同的編譯器產生棧的方式不盡相同,那么調用者能否正常的完成清除工作呢?答案是不能。
如果使用 __stdcall ,上面的問題就解決了,函數自己解決清除工作。所以,在跨(開發)平臺的調用中,我們都使用 __stdcall (雖然有時是以 WINAPI 的樣子出現)。
那么為什么還需要 _cdecl 呢?當我們遇到這樣的函數如 fprintf() 它的參數是可變的,不定長的,被調用者事先無法知道參數的長度,事后的清除工作也無法正常的進行,因此,這種情況我們只能使用 _cdecl。
到這里有一個結論,如果你的程序中沒有涉及可變參數,最好使用 __stdcall 關鍵字,我們創建一個Win32應用程序都是用的系統API函數,參數固定,所以都用__stdcall了。
設計窗口類、冊窗口類、創建窗口、顯示并更新窗口通常一起完成,MSDN中有詳細的說明,可以根據一些默認參數修改窗口樣式。在完成窗口的設計,創建更新后,需要創建一個消息循環。
MSG msg;
while(GetMessage(&msg,NULL,0,0))//消息循環
{
TranslateMessage(&msg);//將虛擬鍵值消息轉化為字符消息,并將字符消息投遞到消息隊列中
DispatchMessage(&msg);//分派一個消息窗口,對消息進行處理
}
GetMessage函數接收到的消息除了WM_QUIT外都返回非零值。
消息響應函數對消息隊列中的消息事件執行處理,在窗口初始化的時候將函數的指針提供給窗口,當事件發生的時候調用函數,消息響應函數在定義前必須在窗口注冊,創建等過程前事先聲明。
DC:Device Contex,是一個包含設備信息的結構體,這個地方的概念不大容易理解。
Windows創建了自己的命名約定,稱之為匈牙利命名法,通常在變量前面加上一些前綴字符。
最后,把原書的代碼抄一遍,雖然是照的書本寫,過程中還是出了一些錯誤,好不容易才調試完。VC開發環境的提示功能幾乎為零,god!
相關推薦:
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |