2011-06-27 19 views
3

語言:C++的UpdateData在MFC

開發環境:微軟的Visual C++

用於圖書館:MFC

問題:我創建了一個偏好配置應用程序。左邊是一個列表框,其中包含可以更改的「父級」設置類別,當它們單擊時,可以更改的設置顯示在列表框的右側,就像在許多大型首選項對話框中一樣。我將所有的控件設置爲DDX數據交換(注意:我有一個用於每個子對話框/首選項頁的cpp文件),所以我完成了所有的基礎設置。

這是我的問題。我很難使用UpdateData,因爲我從來沒有在首選項框中實際調用DoModal(),因爲它們是父對話框容器的子對象,並且它們只是綁定到對話框中的圖片控件。當用戶點擊列表框時,我執行設置焦點和顯示/隱藏子對話框的組合。

當用戶選擇「保存這些」他(她)給出/與另一個對話框,允許他們檢查,他們想保存(生成XML配置文件),該特定偏好窗格。很顯然,我需要爲輸入對象刮對話框,但是當程序到達調用UpdateData的代碼點時,程序將失敗,因爲我在調用DoModal()之前調用了UpdateData。

現在我真的不知道如何去獲取價值。這對MFC我很陌生也沒有幫助。所以就是這樣。無論如何,我會很感激任何人都可以提供的幫助。

回答

1

用戶體驗可能會因使用CTabCtrl提供你似乎是實現這種功能得到改善。

一般而言,在大多數情況下,您不打算直接調用UpdateData,這是一個框架機制,由OnInitDialog加載,OnOK保存爲模態對話框。這不是你可能想到的加載和保存。它所做的是從OnInitDialog中的資源或成員變量中加載控制值,然後當用戶單擊確定時,它將驗證對話框中控件的值並將其保存到成員變量中。這是一種機制,它允許您在重新打開對話框時顯示以前的值,並在關閉對話框後獲取值。

你可以看看CArchive和序列化的對話,但我會建議寫特別是如果處理XML配置文件自己保存/載入框架。

+0

我真的很想避免,如果我能部分地重新做UI。我嘗試過使用OnOK(),因爲我知道它調用UpdateData,但由於我的應用程序工作的方式,它不喜歡我想要做的事情。基本上我有一個「全部保存」按鈕和一個「保存這些」按鈕,它們指定保存哪些子對話框。SaveThese會彈出一個帶有複選框的對話框,以便他們可以指定要保存的窗格,並且這是選擇器的解僱(OnOK),我想要保存信息...需要獲取所有值。我試圖在子對話框中調用OnOK無濟於事。 – Jon

+0

沒有看到代碼,它聽起來像你需要每個窗格的數據結構和一個接口,允許你有這些數據結構的集合,這些數據結構可以用來保存/加載你的無關對話。我假設這些窗格是無模式的,所以一個接口允許你有一個窗格指針的集合,你可以循環通過也可以讓事情變得更容易。 – AJG85

+0

嗯,我得去研究一下......我不確定每個窗格的界面是什麼意思。我對visual-C++和MFC相當陌生,所以一直以來都是一個挑戰。有什麼建議麼?我不想佔用太多時間... – Jon

3

只需你顯示你的子對話框中的一個,你應該調用它的UpdateData(FALSE)功能來填充它的控制。這應該在外部對話框的OnInitDialog中,並且也在切換類別的代碼中。在切換離開子對話框(從類別更改或OnOK)之前,您應該調用UpdateData(TRUE)將更改從子對話框中拉回;如果UpdateData返回FALSE,則不允許更改類別或關閉對話框。

+0

我有一個帶有兩個文本字段T1和T2的窗體。用戶更改T1。 T2在其右側有一個「...」按鈕,打開模式對話框並修改T2。用戶轉到'...'並單擊確定。 T2需要更新。將新值分配給T2關聯變量後,我不能執行'更新數據(FALSE)',因爲它使得T1用戶所做的更改消失。我看到兩種解決問題的方法。 1:調用'T2-> SetWindowText(new_text);'2:爲T2聲明一個'CDataExchange dx(this,FALSE);'變量並執行'DDX_Text'。什麼是最好的方法? – sergiol

+0

@sergiol我假設T1是父對話框的一部分,對嗎?這個答案是關於調用T2的子對話框中的'UpdateData',它不應該影響T1。然後調用子對話框的代碼負責將該對話框中的數據複製到文本控件中。 –