1. 程式人生 > >MFC MDI 視窗函式執行順序

MFC MDI 視窗函式執行順序

(1)MDI視窗初始化時建立順序(預設開啟一個新文件):

AddDocTemplate(pDocTemplate); CMainFrame* pMainFrame = new CMainFrame;

CMainFrame::PreCreateWindow() 兩次, CMainFrame::OnCreate,

CMFC_frameDoc()建構函式,

CChildFrame()建構函式, CChildFrame::PreCreateWindow 三次, 
CMFC_frameView()建構函式, CMFC_frameView::PreCreateWindow一次
再CChildFrame::OnCreate(),(如果主視窗有OnWindowPosChanged(),則會響應,可在此處使

CChildFrame視窗移動),

再CMFC_frameDoc::OnNewDocument()建立新文件.

(2)有主視窗後,新建一個檢視的過程(即按[新建]選單):

CMFC_frameDoc()建構函式,

CChildFrame()建構函式, CChildFrame::PreCreateWindow 三次, ,

CMFC_frameView()建構函式, CMFC_frameView::PreCreateWindow一次

(2.1)關閉一個視窗view時,析構與建立相反:

~CMFC_frameView(), ~CChildFrame(), ~CMFC_frameDoc().

(3)在view的函式中呼叫DestroyWindow();來即關閉view視窗時,doc析構,但CChildFrame依然存在,如果 frame有工具欄toolbar,且toolbar的父視窗是該CChildFrame,那麼該toolbar仍然可以使用(因為該 toolbar屬於CChildFrame,CChildFrame不消失,該toolbar也不消失),但某些按鈕會變灰,如[儲存],因 為沒有view,所以也無[儲存]一說了.

而且此時,CChildFrame仍可以成為當前活動框架,即:
CChildFrame *p= dynamic_cast < CChildFrame*> (GetActiveFrame());p仍有效,非0.

注:我起的名字是MFC_frame,所以會有CMFC_frameDoc,CMFC_frameView.

(4)在view的函式中GetParentFrame()->DestroyWindow(),即關閉整個框架,則view,doc,frame全部關 閉,析構順序為: ~CMFC_frameView(), ~CMFC_frameDoc(), ~CChildFrame(). 此時不能再DestroyWindow()來關閉view了,否則會出錯,因為關閉frame時把view,doc,frame全都關閉 了.

相關推薦

MFC MDI 視窗函式執行順序

(1)MDI視窗初始化時建立順序(預設開啟一個新文件): AddDocTemplate(pDocTemplate); CMainFrame* pMainFrame = new CMainFrame; CMainFrame::PreCreateWindow() 兩次, CM

vue中各選項及鉤子函式執行順序

在vue中,例項選項和鉤子函式和{{}}表示式都是不需要手動呼叫就可以直接執行的。 vue的生命週期如下圖: 在頁面首次載入執行順序有如下: beforeCreate                //在例

JS:函式執行順序

for(var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 1000); } console.log(i + "===="); 這個列印結果不是 0 1 2

靜態塊、例項塊、建構函式執行順序

靜態塊、例項塊、建構函式的執行順序:     1.先執行靜態方法塊    2.再執行例項方法塊    3. 再執行建構函式塊 同一個類下不管new多少次,該類下的靜態塊只執行一次(但是一次可以執行多個) 不管是new幾個類

vue父子元件生命週期函式執行順序

vue父元件載入和銷燬執行最後一個鉤子函式之前先執行一遍子元件的鉤子: 1.載入 父:beforecreate-created-beforeMount-(子:beforecreate-created-beforeMount-mounted)-mounted 2.銷燬 父:beforeDestroy--

js中的for迴圈與非同步回撥函式執行順序問題

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!                for(i=localStorage.length-1;i>=0;i--){//從後往前依次取每條localstorage local_key=local

建構函式執行順序

通過示例說明: #include <iostream> class Base { public: Base(); virtual void f(); virtua

派生類建構函式執行順序及虛基類的概念

派生類建構函式執行順序如下:     所有基類的建構函式,多個基類建構函式的執行順序取決於定義派生類時所指定的順序,與派生類建構函式中所定義的成員初始化列表的引數順序無關; 建構函式的顯示初值初始化,與初始化列表順序無關,而與類中成員定義順序有關。 如: clas

【Java基礎】類的例項化、static、父類建構函式執行順序

重溫java基礎,以免自己以後犯原則性錯誤,這是最基本,最基礎的東西。 直接上程式碼: A.java public class A { int a1 = 8; int a2 = getA2(); { int a3 = 9; System.out.pr

C++派生類的建構函式和解構函式執行順序及其構造形式

    在C++程式設計師的面試中,經常會出現派生類與基類的建構函式、解構函式的執行順序。其實這是一個很基本的問題,沒有什麼難度,只需要記住就OK了。      1.派生類的建構函式和解構函式的執行順序     首先執行基類的建構函式,隨後執行派生類的建構函式,當撤銷派生類物件時,限執行派生類的解構函

vue生命週期中,鉤子函式執行順序

1. 流程圖 2.一般的執行順序(從上往下): beforeCreate           在例項初始化之後,資料觀測(data observer) 和 event/watcher 事件配置之前被呼叫。 created          例項已經建立完成之後被呼叫。在

UIApplicationDelegate裡面最常用的幾個函式執行順序小結

(1)點選桌面圖示正常啟動App或者殺死程序後點擊推送訊息啟動App 1.application:willFinishLaunchingWithOptions 2.application:appl

關於類中new物件與建構函式執行順序的問題

     如下有3個類,其中COM是表示元件類別。Root類包含一個COM物件引用,Root中派生出Stem類(即Stem類繼承Root類)。每個類都有一個無引數的建構函式,列印當前的類名。其中Root類中擁有一個靜態程式碼塊。 package com.practise;

網龍暑期訓練營第一週:MonoBehavior函式執行順序、碰撞與滑鼠事件

本文通過實驗梳理第一週訓練營視訊中所提到的知識點,便於大家複習鞏固,也便於自己日後查閱。視訊內容主要分為三個部分: MonoBehavior的執行順序 碰撞事件 滑鼠事件 配合視訊使用效果更佳。 1.MonoBehavior的執行順序

子類,父類靜態程式碼塊,構造程式碼塊,以及建構函式執行順序

父類: package com.Test; public class StaticExtends { //靜態程式碼塊     static{         System.out.println("父類靜態程式碼塊");         }     //構造程式碼塊   

Qt 訊號連線多個槽函式 執行順序

執行順序   同一訊號連線多個槽呢,槽函式執行沒有絕對的先後順序。如:connect(slider,&QSlider::valueChanged, spin_box,&QSpinBox::setValue);connect(slider,&QSlide

async.js 實現js函式執行順序

function a(callback){ setTimeout(function(){//用timeout模擬回撥方法返回, console.log("a 方法回撥方法結束"); callback(); }, 5000); console.log("a 方法結束");}function b(callba

Java靜態程式碼塊、程式碼塊及建構函式執行順序

根據以下程式進行分析 定義一個父類 package sas.LearnJava; public class ExcuteOrderTest { { System.out.println("我是在父類開始的普通程式碼塊!"); } public ExcuteOrder

JS檔案的**.js和**.min.js的區別,以及js函式執行順序

①**.js和**.min.js的區別 引用 Q: .js和.min.js檔案分別是什麼? A: .js是JavaScript 原始碼檔案, .min.js是壓縮版的js檔案。 Q:為什麼要壓縮為.min.js檔案? 減小體積 .min.js檔案經過壓縮,相對編譯前的js檔案體積較小

Java中static塊,構造塊,建構函式執行順序

public class Father { static { System.out.println("Father靜態塊"); } { System.out.println("Father構造塊"); } public Fath