最簡單的MFC入門教程---WinMain函數基礎篇

最簡單的MFC入門教程

您可以隨便複製本教程,但是請務必保證本教程的完整性,如果您發現有任何技術方面的漏洞請和[email protected]聯繫,或者只是想和我交個朋友也OK!

Kunsa拜上!~~~~

這幾天萌生了一些寫一點東西的想法,以來把自己的知識和大家共享一下,二來是對自己知識的一個總結。就算是一舉兩得吧。我寫的這些文章都是結合我的切身體會,大言不慚地說:我也經歷過一些實際的開發,所以我很能體會到實際工作中的一些漏洞,同時,我又是一個初學者,因此我更能理解初學者在哪些地方會出現問題。如果大家支持的話,我爭取將這個教程做下去,與其說是教程,倒不如說是從網上搜集的一些資料,但是這些東西都是經過我的整理的,絕對適合初學者學習!

1.學學侯捷老師:勿在浮沙築高臺

像大多數教程一樣,我們需要了解一下WindowsSDK編程方式,剛剛突然萌生了一個不成熟的想法,不知道對不對,大家應該對控制檯下的編程有了一些概念,SDK的編程方式就好像是控制檯下的C,沒有封裝(或者說封裝稍微少一些),而MFC的編程方式就好像是控制檯下的C++,動不動就來個類,來個對象,來個虛函數,+_+

所以我們有必要把SDK的編程方式搞清楚,把SDK下的窗口創建自己實現一遍。再次說明,這些技術文檔是純入門,但是我儘量讓您在入門後達到精通。

先來一個最簡單的SDK程序,顯示一個HelloWorldMessageBox (MessageBox是一個API的名字,API全稱爲:Application Programming Interface,即:應用編程接口,我將在下邊進行詳細說明)

 

首先是頭文件,我們注意到SDK和控制檯下的編程包含的頭文件是不一樣的,百度百科上邊這樣說:

WINDOWS.H是主要的含入檔案,它包含了其他Windows表頭檔案,這些表頭檔案的某些也包含了其他表頭檔案。這些表頭檔案中最重要的和最基本的是:

  WINDEF.H 基本型態定義。

  WINNT.H 支援Unicode的型態定義。

  WINBASE.H Kernel函式。

  WINUSER.H 使用者介面函式。

  WINGDI.H 圖形裝置介面函式。

  這些表頭檔案定義了Windows的所有資料型態、函式呼叫、資料結構和常數識別字,它們是Windows文件中的一個重要部分。

如此看來,windows.h這個頭文件包含了我們編程的一些基本需要的東西。在深入理解之前,先記住吧。

然後就是main函數的入口,我們會發現,和控制檯的main函數是不一樣的,但是功能和控制檯下的類似,都是程序的入口點,參數稍微多了點,我們從第一個開始看。

HINSTANCE hInstanceMSDN上邊這樣解釋:[in] Handle to the current instance of the application. 表示該程序當前運行的實例句柄(您可能對句柄的概念不是很清楚,我會在下文寫出),同一個程序可以在同時運行多個實例,操作系統會爲每個實例分配一個實例句柄,該實例句柄就傳給這個參數。

HINSTANCE hPrevInstanceMSDN:[in] Handle to the current instance of the application.在同一個計算機上運行同一個程序的時候計算機會爲它分配不同的實例句柄(關於句柄我會在下邊講解),這個參數就是存儲的程序本身的實例句柄。

HINSTANCE hPrevInstanceMSDN:[in] Handle to the previous instance of the application. This parameter is always NULL. If you need to detect whether another instance already exists, create a uniquely named mutex using the CreateMutex function. CreateMutex will succeed even if the mutex already exists, but the function will return ERROR_ALREADY_EXISTS. This indicates that another instance of your application exists, because it created the mutex first. However, a malicious user can create this mutex before you do and prevent your application from starting. To prevent this situation, create a randomly named mutex and store the name so that it can only be obtained by an authorized user. Alternatively, you can use a file for this purpose. To limit your application to one instance per user, create a locked file in the user's profile directory.這個說的有點長,其實就是當程序不是第一個實例的時候,這個參數存儲的是上一個實例的實例句柄,當是第一個實例的時候,存儲的是NULL

LPSTR lpCmdLineMSDN:[in] Pointer to a null-terminated string specifying the command line for the application, excluding the program name. To retrieve the entire command line, use the GetCommandLine function.這個很好理解,該參數裏邊存儲着傳遞給應用程序的參數串,舉個例子:打開c盤的1.txt文件的時候,使用的是notepad(記事本),那麼傳遞給notepad這個實例的參數串就是c:/1.txt

 int nCmdShow[in] Specifies how the window is to be shown. 指定該窗口的顯示方式:最大化,最小化,正常甚至是隱藏等。

看完了參數再回來看WinMain前邊的WINAPI,我們通過“轉到定義”可以發現WINAPI其實是 #define WINAPI __stdcall 。 關於__stdcall 百度百科上邊這樣解釋: __stdcall修飾關鍵字修飾的函數,其參數都是從右向左通過堆棧傳遞的(__fastcall的前面部分由ecx,edx傳),函數調用在返回前要清理堆棧,但由調用者還是被調用者清理不一定。 其實就是約定了一個堆棧平衡的方式。

下邊我們說一下句柄,句柄在Windows編程裏邊是一個很重要的概念,但是重要並不代表難理解,摘自百度百科:WINDOWS程序中並不是用物理地址來標識一個內存塊,文件,任務或動態裝入模塊的。相反,WINDOWS API給這些項目分配確定的句柄,並將句柄返回給應用程序,然後通過句柄來進行操作。在《WINDOWS編程短平快》(南京大學出版社)一書中是這麼說的:句柄是WINDOWS用來標識被應用程序所建立或使用的對象的唯一整數,WINDOWS使用各種各樣的句柄標識諸如應用程序實例,窗口,控制,位圖,GDI對象等等。WINDOWS句柄有點象C語言中的文件句柄。從上面的2個定義中我們可以看到,句柄是一個標識符,是拿來標識對象或者項目的。它就像我們的車牌號一樣,每一輛註冊過的車都會有一個確定的號碼,不同的車號碼各不相同,但是也可能會在不同的時期出現兩輛號碼相同的車,只不過它們不會同時處於使用之中罷了。應用程序幾乎總是通過調用一個WINDOWS函數來獲得一個句柄,之後其他的WINDOWS函數就可以使用該句柄,以引用相應的對象。在WINDOWS編程中會用到大量的句柄,比如:HINSTANCE(實例句柄),HBITMAP(位圖句柄),HDC(設備描述表句柄),HICON(圖標句柄)等等。這當中還有一個通用的句柄,就是HANDLE。 初學者會認爲句柄和指針有很多共同點,其實卻是是有很多共同點,但是還是有不一樣的,句柄只是一個標識(僅僅起到代表作用),而指針是指向。兩者不同!但是又有相似的地方,比如,Windows中想要操作一個對象就要先得到它的句柄,當然,得到句柄的方法也有很多,我們在接下來遇到的時候再詳細講吧。

這樣我們就完成了一個最簡單的Windows環境下的程序。呼呼。好累!

 

可能您並不能理解我寫的所有的東西,尤其是MSDN上邊的那些,但是作爲初學者,不需要掌握MSDN上邊的那些,僅僅把WinMain函數的各個參數的意義和WINAPI的本質搞清楚就OK了!

發佈了36 篇原創文章 · 獲贊 4 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章