Win32中視窗的建立和訊息機制以及MFC對Win32的封裝簡介

來源:互聯網
上載者:User

首先看一張圖:

程式進入主函數---->註冊視窗類別(RegisterClass)--->建立視窗(CreateWindow)---->抓取訊息並安排分發給相應的視窗函數(GetMessage那個迴圈)----->寫一個處理所有訊息和命令的視窗函數WNDPRO()

 

下面看更詳細的一個圖,詳細到各個函數。

 看看這幾個函數是怎麼寫的:

------------------------------------------------------------------------

 

 

程式進入主函數---->註冊視窗類別(RegisterClass)--->建立視窗(CreateWindow)---->抓取訊息並安排分發給相應的視窗函

數(GetMessage那個迴圈)----->寫一個處理所有訊息和命令的視窗函數WNDPRO()
////
一個差不多完整的視窗訊息機制就這樣了!
但是在MFC中我們把這些函數封裝了起來,注意!它對win32那些起相應功能的部分並不是僵硬的封裝,首先強調這一點!GetMssage()和TranslateMessage()封裝到了CWinApp中,這個類負責程式的初始化運行和結束,將RegisterClass放在了InitApplication函數中。將CreateWindow放在了InitInstance中,這是兩個函數都是虛函數,其中initInstance是個空的虛函數,必須要重載,所以在我們自己程式的App檔案中都重寫了initInstance這個函數,當然我們說了這個並不是僵硬的封裝,我們在這個函數中不像在win32程式中用createwindow()建立主視窗而是直接利用封裝好了的類建立想要的種類的主視窗,比如常用的初始化CFrameWnd類的對象,當然我們也可以建立CDloalg類的對象,這些視窗都是派生於基類CWnd,初始化這些類的一個執行個體就會調用他們的create函數,在這個函數產生視窗之前會引發註冊註冊Wind這個視窗類別型以及它的視窗過程,然後建立這個註冊好類型的一個視窗。我只是大致的說一下這個過程,以便wind32中視窗註冊建立流程對應,實際在mfc中這個流程的的情況要複雜的很多,我說的只是大致的,詳細的去讀深入淺出。             
                 InitApplication在每個程式中只運行一次做一次,我們的視窗類別只用註冊一次所以把它放在裡面
                 InitInstance 每一個這個類的執行個體都會運行一次,我們每一個視窗都需要建立所以.....
        注:MFC中每一個程式都有一個AP類檔案CMyApp,它們都是派生自CWinApp,在這個類中中它調用了InitApplication和InitInstance兩個虛函數.由於每一個視窗初始化方式都可能不同,所以我們在自己的App檔案CMyApp,都會重載InitInstance函數來初始化自己的視窗,這樣基類中調InitInstance()其實是調用使用者自己重載的那個初始化函數。所以我們的每個視窗就不一樣了。這就是虛函數的多樣性。可以去看深入潛出mfc中MFC六大關鍵技術模擬那章,寫得非常好!
        注:上面的GetMssage()和TranslateMessage()這些抓取和指派訊息的函數被封裝到了CWinApp類的Run函數中。

        注:CWnd類作為所有視窗類別的基類,裡面封裝了建立視窗的函數(視窗類別用的是註冊了的Wnd),也封裝了視窗過程函數WindowProc和DefWindowProc,當訊息出發時訊息被捕捉然後被發送到WindowProc中(前面的流程略,可以看看AfxWndProc這個函數),如果定義了messagemap(BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之間的東西,WindowProc這個函數就會讓OnWndMsg()這個函數去處理,去找訊息對應的函數。如果不是就讓系統預設的DefWindowProc去處理。所以我們在遇到沒有在訊息影射宏裡進行映射並且在DefWindowProc函數中沒有的情況下就重寫他的視窗過程自己進行訊息的捕捉和處理,最好重載DefWindowProc這個函數,否則那個messagemap就沒什麼用了,要在這個函數中自己接收訊息然後指定給它處理函數才行。因為重寫的這個函數中沒有OnWndMsg這個函數。
By the way!訊息觸發被發現並發送到該類時尋找該類的視窗過程,如果類中沒有就去尋找上層類的,一層一層,如果都沒進行重寫那就找到了CWnd的WindowProc中。虛函數就是有用!

MFC程式對win32的封裝總結(視窗類別的註冊,視窗的建立,視窗的視窗過程指定) 這篇文章中我會告訴說明MFC中是如何把這win32程式的幾個關鍵函數封裝到它的架構裡的。

想更瞭解MFC對win32的封裝可以查看深入淺出mfc,可以著重看一下第六章,或者進入這個網址:

http://www.vczx.com/tutorial/mfc/mfc1.php和

http://www.diybl.com/course/3_program/vc/vc_js/2008520/117199.html

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.