關于模式與非模式對話框_第1頁
關于模式與非模式對話框_第2頁
關于模式與非模式對話框_第3頁
關于模式與非模式對話框_第4頁
關于模式與非模式對話框_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、關于模式與非模式對話框對話框有兩種創(chuàng)建方式:DoModal 和 Creat 。 其中 DoModal 創(chuàng)建的是模態(tài)的對話框,而 Creat 創(chuàng)建的是非模態(tài)的對話框下面總結下他 們的不同。對于模態(tài)的對話框,在該對話框被關閉前,用戶將不能在同一應用程序的其他地方進行工作(例如 open file對話框,而對于非模態(tài)的 對話框,在它留在屏幕上的同時可以在其他的地方進行工作,(例如 find file對話框Create 的 Dialog 一般是 modalless, 如果你的程序本身就是只有一個 Dialog ,就無所謂了,看不出 modalless 的效果。 modalless 本 來就是讓有機會切

2、換到本程序的其他窗口。下面摘抄一部分,很基礎,很 全 面非模態(tài)對話框的 特點與 模態(tài)對話框不同,非模態(tài)對話框不 壟斷 用戶的 輸入 ,用戶 打開 非模態(tài)對話框 后 , 仍然 可以 與 其它 界 面進行 交互 。非模態(tài)對話框的 設計與 模態(tài)對話框基本 類似 , 也包括設計 對話框模 板 和 設計 CDialog 類 的 派生類 兩部分。 但 是,在對話框的創(chuàng)建和 刪 除過 程中,非模態(tài)對話框 與 模態(tài)對話框 相比 有下 列 不同 之處 :非模態(tài)對話框的模 板必須具 有 Visible 風格 , 否則 對話框將不可 見 ,而模態(tài)對話框 則 無 需設置 該 項風格 。 更保險 的 辦法 是 調 用

3、CWnd:ShowWindow(SW_SHOW來 顯示 對話框,而不 管 對話框是 否具 有 Visible 風格 。非模態(tài)對話框對 象 是用 new 操 作 符 在 堆 中 動 態(tài)創(chuàng)建的,而不是以 成員變量 的 形 式 嵌入 到 別 的對 象 中 或 以 局 部 變量 的 形 式 構 建 在 堆棧 上。 通常 應在對話框的 擁 有 者 窗口 類內聲明 一個 指向 對話框 類 的 指針成員變量 , 通過 該 指針 可 訪問 對話框對 象 。通過調 用 CDialog:Create函數 來 啟動 對話框, 而不是 CDialog:DoModal, 這 是模態(tài)對話框的關 鍵 所在。 由 于 Cre

4、ate 函 數 不 會 啟動新 的 消息循環(huán) ,對話框 與 應用程序共用同一個 消息循環(huán) , 這樣 對話框就不會 壟斷 用戶的 輸入 。 Create 在 顯示 了對話框 后 就 立 即返回 ,而 DoModal 是在對話框被關閉 后 才返回 的。 眾 所 周知 ,在 MFC 程序中,窗口對 象 的 生 存期 應 長 于對應的窗口, 也 就是 說 ,不能在 未 關閉屏幕上窗口的 情況 下 先把 對應的窗口對 象刪除 掉 。 由 于在 Create 返回 后 ,不能 確定 對話框是 否 已 關閉, 這樣也 就無 法 確定 對話框對 象 的 生 存期 , 因此 只 好 在 堆 中 構 建對話框對

5、象 ,而不能以 局 部 變量 的 形 式來 構 建 之 。必須調 用 CWnd:DestroyWindow而不是 CDialog:EndDialog來關閉非模態(tài)對話框。 調 用 CWnd: DestroyWindow是 直接 刪除 窗口的一般方 法 。 由 于 缺省 的 CDialog:OnOK和 CDialog:OnCancel 函數 均 調 用 EndDialog , 故 程序 員必須 編寫 自己 的 OnOK 和 OnCancel 函數 并且 在 函數 中 調 用 DestroyWindow 來關閉對話框。因為 是用 new 操 作 符構 建非模態(tài)對話框對 象 , 因此 必須 在對話框關

6、閉 后 ,用 delete 操 作 符刪除 對話框對 象 。在屏幕上一個窗 口被 刪除后 ,框 架 會 調 用 CWnd:PostNcDestroy, 這 是一個 虛擬 函數 ,程序可以在該 函數 中 完 成刪除 窗口對 象 的工作, 具 體代 碼 如下void CModelessDialog:PostNcDestroydelete this; /刪除 對 象 本身這樣 ,在 刪除 屏幕上的對話框 后 ,對話框對 象 將被 自 動刪除 。 擁 有 者 對 象 就不 必顯 式的 調 用 delete 來 刪除 對話框對 象 了。必須 有一個 標志表 明 非模態(tài)對話框是 否 是 打開 的。 這樣

7、做 的 原因 是用戶有可能在 打開 一個模態(tài)對話框的 情況 下, 又 一 次選擇 打開 命令 。程序 根據標志 來 決定 是 打開 一 個 新 的對話框, 還 是 僅僅把原 來 打開 的對話框 激活 。 通常 可以用 擁 有 者 窗口中的 指向 對 話框對 象 的 指針 作 為 這 種 標志 , 當 對話框關閉時, 給 該 指針 賦 NULL 值 ,以 表 明 對話框對 象 已 不 存 在了。提 示 :在 C+編 程中, 判 斷 一個 位 于 堆 中的對 象 是 否 存 在的 常 用方 法 是 判 斷指向 該對 象 的 指針 是 否 為空 。 這 種機制要求 程序 員 將 指向 該對 象 的

8、指針 初始化為 NULL 值 ,在創(chuàng)建對 象 時將 返回 的地 址賦給 該 指針 ,而在 刪除 對 象 時將該指針置成 NULL 值 。根據 上面的分 析 , 我 們很 容易把 Register 程序中的 登錄 數 據 對話框 改 成 非模態(tài)對話框。 這樣 做 的 好 處 在于如果用戶在 輸入數 據 時 發(fā) 現編輯視圖 中有 錯誤 的 數 據 , 那么 不 必 關閉對話框,就可以在 編輯視圖 中進行 修改 。窗口對 象 的 自 動 清 除一個 MFC 窗口對 象包括 兩方面的 內 容 :一是窗口對 象 封裝 的窗口, 即存 放 在 m_hWnd成員 中的 HWND (窗口 句柄 , 二 是窗口

9、對 象 本身是一個 C+對 象 。 要 刪除 一個 MFC 窗口對 象 ,應該 先 刪除 窗口對 象 封裝 的窗口, 然后刪除 窗口對 象 本身。刪除 窗口 最 直接 方 法 是 調 用 CWnd:DestroyWindow或 :DestroyWindow,前 者 封裝 了 后者 的 功 能。 前 者 不 僅 會 調 用 后者 , 而 且 會 使 成員 m_hWnd保 存 的 HWND 無效 (NULL。如果 DestroyWindow 刪除 的是一個 父 窗口 或擁 有 者 窗口, 則 該 函數 會 先自 動刪除 所 有的 子 窗 口 或 被 擁 有 者 , 然后 再 刪除 父 窗口 或擁

10、有 者 。在一般 情況 下,在程序中不 必 直接 調 用 DestroyWindow 來 刪除 窗口, 因為 MFC 會 自 動調 用 DestroyWindow 來 刪除 窗口。 例如, 當 用戶 退 出應用程序時, 會 產 生 WM_CLOSE消息 , 該 消息 會 導致 MFC 自 動調 用 CWnd:第 1 頁 共 4 頁DestroyWindow 來 刪除 主 框 架 窗口, 當 用戶在對話框 內 按 了 OK 或 Cancel 按鈕 時, MFC 會 自 動調 用 CWnd: DestroyWindow來 刪 除 對話框 及 其 控件 。窗口對 象 本身的 刪除則 根據 對 象 創(chuàng)

11、建方式的不同,分 為 兩種 情況 。在 MFC 編 程中,會 使 用 大 量 的窗口對 象 ,有 些 窗口對 象 以 變量 的 形 式 嵌入 在 別 的對 象內或 以 局 部 變量 的 形 式創(chuàng)建在 堆棧 上,有 些 則 用 new 操 作 符 創(chuàng)建在 堆 中。對于一個以 變量形 式創(chuàng)建的窗口對 象 ,程 序 員 不 必 關 心 它的 刪除問 題 , 因為 該對 象 的 生 命期 總是有 限 的, 若 該 對 象 是 某 個對 象 的 成員變量 ,它會 隨著父 對 象 的 消 失 而 消 失 , 若 該對 象 是一個 局 部 變量 , 那么 它會在 函數 返回 時被 清 除 。對于一個在 堆

12、中 動 態(tài)創(chuàng)建的窗口對 象 ,其 生 命期 卻 是 任意 長 的。 初 學 者 在 學習 C+編 程時,對 new 操 作 符 的 使 用 往往 不 太踏實 , 因為 用 new 在 堆 中創(chuàng)建對 象 ,就不能 忘記 用 delete 刪除 對 象 。 讀 者 在 學習 MFC 的例程時,可能會 產 生這樣 的 疑 問 , 為 什 么 有 些 程序用 new 創(chuàng)建了一個窗口對 象 , 卻 未 顯 式的用 delete 來 刪除 它 呢? 問 題 的 答案 就是有 些 MFC 窗口對 象具 有 自 動 清 除 的 功 能。如前面 講述 非模態(tài)對話框時所 提 到的, 當 調 用 CWnd:Dest

13、royWindow或 : DestroyWindow刪除 一個窗口時,被 刪除 窗口的 PostNcDestroy 成員函數 會被 調 用。 缺省 的 PostNcDestroy 什 么 也 不 干 , 但 有 些 MFC 窗口 類 會 覆蓋 該 函數 并 在 新 版 本的 PostNcDestroy 中 調 用 delete this來 刪除 對 象 , 從 而 具 有了 自 動 清 除 的 功 能。 此 類 窗口對 象通常 是用 new 操 作 符 創(chuàng)建在 堆 中的, 但 程 序 員 不 必操 心 用 delete 操 作 符 去 刪除 它們, 因為 一 旦 調 用 DestroyWind

14、ow 刪除 窗口,對應的窗口對 象也 會 緊 接 著 被 刪除 。不 具 有 自 動 清 除 功 能的窗口 類 如下所 示 。 這 些 窗口對 象通常 是以 變量 的 形 式創(chuàng)建的,無 需 自 動 清 除 功 能。所有 標 準 的 Windows 控件 類 。從 CWnd 類 直接 派生 出來的 子 窗口對 象 (如用戶 定制 的 控件 。切分窗口 類 CSplitterWnd 。缺省 的 控 制 條 類 (包括 工 具 條、狀 態(tài) 條 和對話 條 。模態(tài)對話框 類 。具 有 自 動 清 除 功 能的窗口 類 如下所 示 , 這 些 窗口對 象通常 是在 堆 中創(chuàng)建的。主 框 架 窗口 類 (

15、直接 或 間 接 從 CFrameWnd 類派生 。視圖 類 (直接 或 間 接 從 CView 類派生 。讀 者 在 設計 自己 的 派生 窗口 類 時,可 根據 窗口對 象 的創(chuàng)建方 法 來 決定 是 否 將窗口 類設計成 可以 自 動 清 除 的。例如,對于一個非模態(tài)對 話框來 說 ,其對 象 是創(chuàng)建在 堆 中的, 因此 應該 具 有 自 動 清 除 功 能。綜 上所 述 ,對于 MFC 窗口 類 及 其 派生類 來 說 ,在程序中一般不 必顯 式 刪除 窗口對 象 。 也 就是 說 , 既 不 必調 用 DestroyWindow 來 刪除 窗口對 象 封裝 的窗口, 也 不 必顯 式

16、地用 delete 操 作 符 來 刪除 窗口對 象 本身。 只 要 保 證 非 自 動 清 除 的窗口對 象 是以 變量 的 形 式創(chuàng)建的, 自 動 清 除 的窗口對 象 是在 堆 中創(chuàng)建的, MFC 的 運 行機 制 就可以 保 證 窗口對 象 的 徹底 刪除 。如果 需 要 手 工 刪除 窗口對 象 , 則 應該 先 調 用 相 應的 函數 (如 CWnd:DestroyWindow 刪除 窗口, 然后 再 刪除 窗口對 象 . 對于以 變 量形 式創(chuàng)建的 窗口對 象 ,窗口對 象 的 刪除 是框 架自 動 完 成 的 . 對于在 堆 中 動 態(tài)創(chuàng)建了的非 自 動 清 除 的窗口對 象

17、, 必須 在窗口被 刪除后 , 顯 式地 調 用 delete 來 刪除 對 象 (一般 在 擁 有 者或 父 窗口的 析 構函數 中進行 . 對于 具 有 自 動 清 除 功 能的窗口對 象 ,只 需調 用 CWnd: DestroyWindow 即 可 刪除 窗口和窗口對 象 。 注意 ,對于在 堆 中創(chuàng)建的窗口對 象 ,不 要 在窗口 還未 關閉的 情況 下就用 delete 操 作 符 來 刪 除 窗口對 象 .提 示 :在非模態(tài)對話框的 OnCancel 函數 中可以不 調 用 CWnd: DestroyWindow, 取 而 代 之 的是 調 用CWnd:ShowWindow(SW

18、_HIDE來 隱藏 對話框 . 在下 次 打開 對話框時就不 必調 用 Create 了,只 需調 用CWnd:ShowWindow(SW_SHOW來 顯示 對話框 . 這樣 做 的 好 處 在于對話框中的 數 據 可以 保 存 下來, 供 以 后 使用 . 由 于 擁 有 者 窗口在被關閉時會 調 用 DestroyWindow 刪除 每 一個所 屬 窗口, 故 只 要 非模態(tài)對話框是 自 動 清 除 的, 程序 員 就不 必 擔心 對話框對 象 的 刪除問 題.=以下是一 點 資料供參考 ,非模態(tài)對話框的 銷毀順 序:MFC 應用程序中 處 理 消息 的 順 序1.AfxWndProc(

19、該 函數 負責 接 收 消息 , 找 到 消息 所 屬 的 CWnd 對 象 , 然后調 用 AfxCallWndProc2.AfxCallWndProc( 該 函數 負責 保 存 消息 (保 存 的 內 容 主 要 是 消息 標 識 符 和 消息 參 數 供 應用程序以 后 使 用,然后調 用 WindowProc(函數3.WindowProc( 該 函數 負責 發(fā) 送 消息 到 OnWndMsg(函數 ,如果 未 被 處 理 , 則調 用 DefWindowProc(函數第 2 頁 共 4 頁4.OnWndMsg( 該 函數 的 功 能 首 先 按字 節(jié) 對 消息 進行 排 序,對于 WM

20、_COMMAND消息 , 調 用 OnCommand(消息 響 應 函數 ,對于 WM_NOTIFY消息調 用 OnNotify(消息 響 應 函數 。 任 何 被 遺漏 的 消息 將是一個窗口 消息 。 OnWndMsg(函數 搜索 類 的 消息 映像 ,以 找 到一個能 處 理任 何 窗口 消息 的 處 理 函數 。如果 OnWndMsg(函數 不能 找 到 這樣 的 處 理 函數 的話, 則把 消息 返回 到 WindowProc(函數 , 由 它將 消息 發(fā) 送 給 DefWindowProc(函數5.OnCommand( 該 函數 查 看 這 是不是一個 控件 通 知 (lParam

21、參 數 不 為 NULL ,如果 lParam 參 數 為空 的話, 說 明 該 消息 不是 控件 通 知 ,如果它是, OnCommand(函數 會 試 圖 將 消息 映射 到 制 造 通 知 的 控件 ;如果他不是一個 控件 通 知 (或者 如果 控件 拒絕映射 的 消息 OnCommand(就會 調 用 OnCmdMsg(函數 6.OnCmdMsg( 根據接 收 消息 的 類 , OnCmdMsg(函數 將在一個 稱 為命令 傳遞 (Command Routing的 過 程中 潛 在的 傳遞 命令 消息 和 控件 通 知 。例如:如果 擁 有該窗口的 類 是一個框 架 類 , 則 命令

22、和 通 知 消息也 被 傳遞 到 視圖 和 文檔 類 , 并為 該類 尋 找 一個 消息處 理 函數=MFC 應用程序創(chuàng)建窗口的 過 程1.PreCreateWindow( 該 函數 是一個 重載 函數 ,在窗口被創(chuàng)建前,可以在該 重載 函數 中 改 變 創(chuàng)建 參 數(可以 設置 窗口 風格 等等 2.PreSubclassWindow( 這也 是一個 重載 函數 , 允許 首 先 子 分 類 一個窗口3.OnGetMinMaxInfo( 該 函數 為 消息 響 應 函數 , 響 應的是 WM_GETMINMAXINFO消息 , 允許 設置 窗口的 最大 或者 最 小尺寸4.OnNcCreat

23、e( 該 函數也 是一個 消息 響 應 函數 , 響 應 WM_NCCREATE消息 , 發(fā) 送 消息 以 告訴 窗口的 客 戶 區(qū)即 將被創(chuàng)建5.OnNcCalcSize( 該 函數也 是 消息 響 應 函數 , 響 應 WM_NCCALCSIZE消息 ,作用是 允許 改 變 窗口 客 戶 區(qū) 大 小6.OnCreate( 該 函數也 是一個 消息 響 應 函數 , 響 應 WM_CREATE消息 , 發(fā) 送 消息 告訴 一個窗口 已 經 被創(chuàng)建7.OnSize( 該 函數也 是一個 消息 響 應 函數 , 響 應 WM_SIZE消息 , 發(fā) 送 該 消息 以 告訴 該窗口 大 小 已 經發(fā)

24、 生變 化8.OnMove( 消息 響 應 函數 , 響 應 WM_MOVE消息 , 發(fā) 送 此 消息 說 明 窗口在 移 動9.OnChildNotify( 該 函數 為 重載 函數 ,作 為 部分 消息 映射 被 調 用, 告訴 父 窗口 即 將被 告 知 一個窗口 剛剛 被創(chuàng)建=MFC 應用程序關閉窗口的 順 序 (非模態(tài)窗口 1.OnClose( 消息 響 應 函數 , 響 應窗口的 WM_CLOSE消息 , 當 關閉 按鈕 被 單擊 的時 候 發(fā) 送 此 消息2.OnDestroy( 消息 響 應 函數 , 響 應窗口的 WM_DESTROY消息 , 當 一個窗口將被 銷毀 時, 發(fā)

25、 送 此 消息3.OnNcDestroy( 消息 響 應 函數 , 響 應窗口的 WM_NCDESTROY消息 , 當 一個窗口被 銷毀 后 發(fā) 送 此 消息4.PostNcDestroy( 重載 函數 ,作 為 處 理 OnNcDestroy(函數 的 最 后動 作,被 CWnd 調 用=MFC 應用程序中 打開 模式對話框的 函數調 用 順 序1.DoModal( 重載 函數 , 重載 DoModal(成員函數2.PreSubclassWindow( 重載 函數 , 允許 首 先 子 分 類 一個窗口3.OnCreate( 消息 響 應 函數 , 響 應 WM_CREATE消息 , 發(fā) 送

26、 此 消息 以 告訴 一個窗口 已 經 被創(chuàng)建4.OnSize( 消息 響 應 函數 , 響 應 WM_SIZE消息 , 發(fā) 送 此 消息 以 告訴 窗口 大 小 發(fā) 生變 化5.OnMove( 消息 響 應 函數 , 響 應 WM_MOVE消息 , 發(fā) 送 此 消息 ,以 告訴 窗口 正 在 移 動6.OnSetFont( 消息 響 應 函數 , 響 應 WM_SETFONT消息 , 發(fā) 送 此 消息 ,以 允許 改 變 對話框中 控件 的 字 體第 3 頁 共 4 頁7.OnInitDialog( 消息 響 應 函數 , 響 應 WM_INITDIALOG消息 , 發(fā) 送 此 消息 以 允

27、許 初始化 對話框中的 控件 , 或者 是創(chuàng)建 新 控件8.OnShowWindow( 消息 響 應 函數 , 響 應 WM_SHOWWINDOW消息 ,該 函數 被 ShowWindow(函數調 用9.OnCtlColor( 消息 響 應 函數 , 響 應 WM_CTLCOLOR消息 ,被 父 窗口 發(fā) 送 已改 變 對話框 或 對話框上面 控件 的 顏色10. OnChildNotify( 重載 函數 ,作 為 WM_CTLCOLOR消息 的結果 發(fā) 送= MFC 應用程序中關閉模式對話框的 順 序1.OnClose( 消息 響 應 函數 , 響 應 WM_CLOSE消息 , 當 " 關閉 " 按鈕 被 單擊 的時 候 ,該 函數 被 調 用2.OnKillFocus( 消息 響 應 函數 , 響 應 WM_KILLFOCUS消息 , 當 一個窗口 即 將 失去 鍵 盤 輸入 焦 點 以前被 發(fā) 送3.OnDestroy( 消息 響 應 函數 , 響 應 WM_DESTROY消息 , 當 一個窗口 即 將被 銷毀 時,被 發(fā) 送4.OnNcDestroy( 消息 響 應 函數 , 響 應 WM_N

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論