MODELESS 範例:使用 CDialog 物件做為非強制回應對話方塊
更新:2007 年 11 月
MODELESS 範例示範將 MFC CDialog 物件做為非強制回應對話方塊的使用方式。MODELESS 是一個簡易、以對話方塊為基礎的應用程式,這個應用程式會在其主對話方塊中管理清單方塊,同時提供一個可以讓您將字串加入至主視窗中清單方塊的非強制回應對話方塊。
安全性注意事項: |
---|
這個程式碼範例僅供概念說明之用,同時因為範例中的程式碼撰寫並沒有周全的顧及所有安全性問題,所以本範例不適用於實際執行的應用程式或網站中。如果使用者擅自將範例程式碼用於其他意圖而導致連帶事件或重大損害時,Microsoft 將不承擔任何責任。 |
若要取得範例和指示以便進行安裝:
按一下 Visual Studio [說明] 功能表上的 [範例]。
如需詳細資訊,請參閱尋找範例檔案。
最新版的完整範例清單可從 Visual Studio 2008 範例網頁 (英文) 取得。
您也可以將範例置於電腦硬碟中。根據預設,範例和讀我檔案都會複製到 \Program Files\Visual Studio 9.0\Samples\ 下的資料夾中。對於所有的 Visual Studio Express 版,所有範例都可在線上找到。
建置和執行範例
若要建置並執行 MODELESS 範例
開啟 modeless.sln 方案。
在 [建置] 功能表上,按一下 [建置]。
在 [偵錯] 功能表上,按一下 [啟動但不偵錯]。
此範例啟動時,會呈現一個空的清單方塊。您可以按一下 [新增] 來開啟非強制回應對話方塊。即使 [Modeless Adder] 對話方塊是開啟的,您還是可以將焦點帶回至主對話方塊。當非強制回應對話方塊開啟時,主對話方塊的 [Add] 按鈕便無法使用,因此使用者無法建立一個以上的非強制回應對話方塊執行個體。
主對話方塊的 CMainDlg 類別可以管理非強制回應對話方塊的指標。這種做法只是為了方便起見;一旦建立後,非強制回應對話方塊就不需要進一步的管理。在應用程式中,您可能會選擇要提供非強制回應對話方塊資訊 -- 就是指標會提供對管理該對話方塊的 C++ 物件的存取權,因此會是很好的起點。
主對話方塊中 [Add] 按鈕的程式碼會使用 Create 函式建立非強制回應對話方塊,而不是呼叫 DoModal。因此方塊變成非強制回應;Windows 處置各方塊訊息的方式並不相同。終結方塊時,並非使用 EndDialog,而是呼叫 DestroyWindow。由於一般 CDialog 物件的 OnOk 和 OnCancel 成員函式會呼叫 EndDialog,因此請確定您的非強制回應對話方塊不會呼叫那些函式,而是會加以覆寫來呼叫 DestroyWindow。
通常,當建立強制回應 (Modal) 對話方塊時,您會在 DoModal 傳回後以手動將之終結。因為您不能在顯示非強制回應對話方塊時等候 Create 傳回,所以您必須要有一些其他機制,用來終結與視窗關聯的 C++ 物件。這個範例使用非常簡單的機制:它會在 PostNcDestroy (在被終結之方塊的非工作區 (Nonclient Area) 後所呼叫的函式) 中執行 delete this 。
請注意,非強制回應對話方塊會使用兩種不同的方式來與其父對話方塊進行通訊。首先,當使用者按下 [確定] 時,非強制回應對話方塊內編輯控制項中的字串,就會加入至強制回應對話方塊的清單方塊內容。接下來,當使用者以任一方式終結視窗時,非強制回應對話方塊就會呼叫強制回應視窗中的 BoxDone 函式。這個函式只是將指標重設到強制回應對話方塊,並重新啟用 [加入] 按鈕。
關鍵字
本範例會使用下列關鍵字:
AfxGetApp; CDC::DrawIcon; CDC::GetSafeHdc; CDialog::Create; CDialog::DoModal; CDialog::OnCancel; CDialog::OnOK; CListBox::AddString; CMenu::AppendMenu; CMenu::ModifyMenu; CRect::Height; CRect::Width; CString::IsEmpty; CString::LoadString; CWinApp::InitInstance; CWinApp::LoadStdProfileSettings; CWnd::DestroyWindow; CWnd::DoDataExchange; CWnd::EnableWindow; CWnd::GetClientRect; CWnd::GetDlgItem; CWnd::GetWindowText; CWnd::IsIconic; CWnd::OnPaint; CWnd::OnQueryDragIcon; CWnd::OnSysCommand; CWnd::PostNcDestroy; CWnd::SendMessage; CWnd::SetActiveWindow; GetSystemMenu; GetSystemMetrics; LoadIcon
注意事項: |
---|
部分範例 (包括本範例) 尚未經過改寫,無法反映出目前在 Visual C++ 精靈、程式庫以及編譯器方面的變更,不過還是可以示範如何完成您要進行的工作。 |