VC/MFC中視窗建立和銷毀以及MFC應用程式架構

來源:互聯網
上載者:User

在說明視窗銷毀的過程之前要必要先弄清楚視窗類別、視窗對象、視窗的概念以及它們的區別和聯絡。

視窗

        即我們在電腦案頭上看到的應用程式介面,系統為每一個視窗維護了一個WNDCLASS結構體用來描述這個視窗的各種屬性(如視窗風格、表徵圖、畫刷、菜單和視窗過程等)。系統還會為這個視窗儲存它的位置、大小狀態以及視窗所屬的進程。如果你想查詢和操作這些屬性,你無法直接操作他們,因為你不知道他們的地址。它們是系統負責維護的。但是系統提供和很多函數讓你去操作它們。系統為每個視窗都維護了這些資料結構,你必須指明你要操作哪個視窗。所以視窗控制代碼呼之欲出了,視窗控制代碼就是用來標識一個視窗的(以及系統為這個視窗維護的資料結構)。所以Windwos
SDK中幾乎每一個操作視窗的函數都需要視窗控制代碼作參數。視窗即是電腦案頭上的介面和系統為這個介面在背後維護的一系列結構體。

 

視窗類別

       Windows SDK中建立一個視窗的過程

       說到視窗類別,還得回顧一下我們在Windows SDK編程時建立一個視窗的過程。

  •        設計視窗類別(設定各種屬性。注意這個視窗類別只是一個結構體,不是我們要討論的視窗類別)
  •        註冊視窗類別
  •        建立視窗(更加設計的視窗類別結構體建立視窗)
  •            顯示視窗
  •        更新視窗
  •        訊息迴圈
  •        視窗過程(在視窗過程中你可以根據收到的訊息調用不同的函數,而且每個訊息都有預設的處理過程DefWindowProc (hwnd, message, wParam, lParam),DefWindowProc會根據訊息調用不同的處理函數。)

       上面過程中,在視窗建立好後我們可以調用各種函數來操作視窗。多半是在視窗過程中操作串口。很多訊息都會有預設的函數調用。

MFC用視窗類別幫我們把視窗和上面這些繁瑣的過程用一個C++類封裝起來了,還根據視窗的不同提供了幾種預設風格的視窗類別。視窗控制代碼成了視窗類別的公開成員變數m_hWnd,對視窗的操作函數成了視窗類別的成員方法。還用宏定義把訊息和預設的成員方法關聯起來。

        視窗類別中的方法(函數)分類:

  • 對視窗進行操作的函數:這些函數就是SDK提供的函數的再次封裝和升級,只是你再不需要傳遞視窗控制代碼給它們們。因為它們可以直接存取類的成員變數m_hWnd。有些是自動調用的,當然都可以顯示調用它們。有些還可以重載。
  • 訊息響應函數:這些函數都有訊息映射(貌似VC是用宏實現的)。不同的訊息會有不同的訊息響應函數。這些響應函數會調用上面的對視窗進行操作的函數。為了讓你改變這些訊息的預設處理方式。這些函數都設定成了虛函數,你可以重載它們。

總結一下:視窗類別就是一個C++類,它把視窗和對視窗的操作函數封裝到了一起。

 

視窗類別對象:

        就是上面視窗類別產生的執行個體對象。

 

 

 MFC中視窗類別對象和視窗之間的區別和聯絡:

        根據前面的描敘,視窗類別對象的一個成員變數m_hWnd是和某一個視窗關聯的。m_hWnd是它們的紐帶。

        視窗類別對象通過視窗類別的建構函式或解構函式建立或銷毀。而視窗是通過調用視窗類別對象的成員函數Create或CreateEx或DoModa建立的。建立後用m_hWnd標識它。視窗的銷毀是通過調用視窗類別對象的成員函數DestroyWindow來銷毀的。DestroyWindow銷毀視窗後視窗類別對象依然存在。但是delete銷毀視窗對象時,它附帶的視窗也會被銷毀。

 

 

 

 

 

 

MFC視窗的建立過程

        MFC不止封裝好了視窗類別。而且把視窗的建立、初始化工作以及訊息迴圈也用一個WinApp類封裝了起來。WinApp類有一個主要的成員函數InitInstance ()就是用來完成視窗的建立和初始化的。把訊息迴圈機制封裝在Run成員函數中。下面是MFC程式的啟動步驟。

          一個MFC程式會定義一個全域的WinApp變數,然後在入口函數中得到這個全域WinApp變數的指標pApp。

          通過pApp調用WinApp::InitInstance()成員函數完成視窗的建立和初始化。(我們的視窗類別就是在這裡發揮作用的,WinApp有個視窗類別的成員變數。這樣WinApp就和視窗關聯起來了)

                  通過pApp調用Run成員函數進入訊息迴圈。到這裡就和我們的win32 sdk程式的架構一樣全了。看來MFC只是把原來的Win32 SDK架構封裝了一下。

 

 

 

 

 

 //待續。。。

 

 

 

 

 

 

 

 

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.