UpdateData в MFC - PullRequest
       1

UpdateData в MFC

3 голосов
/ 27 июня 2011

Язык : C ++

Среда разработки : Microsoft Visual C ++

Используемые библиотеки : MFC

Проблема : Я создал приложение для настройки предпочтений. Слева находится список со «родительскими» категориями настроек, которые они могут изменить, и когда они щелкают по одной, настройки, которые они могут изменить, появляются справа от списка, как во многих больших диалоговых окнах настроек. У меня все мои элементы управления настроены с обменом данными DDX (примечание: у меня есть файл cpp для каждого поддиалога / страницы предпочтений), поэтому у меня есть все базовые настройки.

Вот моя проблема. Мне трудно использовать UpdateData, потому что я никогда не вызываю DoModal () для полей предпочтений, потому что они являются дочерними элементами родительского контейнера диалога, и они просто привязаны к элементу управления рисунками в диалоговом окне. Я выполняю комбинацию настройки фокуса и отображения / скрытия поддиалогов, когда пользователь щелкает по списку.

Когда пользователь выбирает «Сохранить эти», ему / ей предоставляется другое диалоговое окно, которое позволяет ему проверить, какие конкретные панели предпочтений они хотят сохранить (для создания файлов конфигурации XML). Очевидно, мне нужно очистить диалоговое окно для их ввода, но когда программа достигает точки в коде, где она вызывает UpdateData, программа завершается ошибкой, потому что я вызываю UpdateData перед вызовом DoModal ().

Теперь я не совсем уверен, как получить значения. Это также не помогает, что я очень плохо знаком с MFC. Вот и все. В любом случае, я был бы признателен за любую помощь, которую может предложить каждый.

Ответы [ 2 ]

3 голосов
/ 27 июня 2011

Непосредственно перед тем, как показать один из ваших под-диалогов, вы должны вызвать его функцию UpdateData(FALSE), чтобы заполнить ее элементы управления. Это должно быть в OnInitDialog внешнего диалога, а также в коде, который переключает категории. Непосредственно перед переключением из поддиалога (либо из изменения категории, либо из OnOK) вы должны вызвать UpdateData(TRUE), чтобы вытащить изменения из поддиалога; не допускайте изменения категории или закрытия диалогового окна, если UpdateData возвращает FALSE.

1 голос
/ 27 июня 2011

Пользовательский опыт может быть улучшен с помощью CTabCtrl, который обеспечивает ту функциональность, которую вы, похоже, реализуете.

Как правило, вы не должны вызывать UpdateData напрямую, в большинстве случаев этомеханика фреймворка, вызываемая OnInitDialog для загрузки и OnOK для сохранения модальных диалогов.Это не загрузка и сохранение в том смысле, в каком вы думаете.Он загружает значения элементов управления из переменных ресурса или члена в OnInitDialog, а затем, когда пользователь нажимает кнопку «ОК», он проверяет и сохраняет значения элементов управления в диалоговом окне в переменных-членах.Это механизм, который позволяет вам отображать предыдущие значения при повторном открытии диалога, а также выводить значения после его закрытия.

Вы можете посмотреть CArchive и сериализовать ваши диалоги, но я бы предложил написать вашисобственная структура сохранения / загрузки, особенно если речь идет о файлах конфигурации XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...