2016-12-10 5 views
0

Я добавил поле со списком в свое диалоговое окно MFC. И я добавил и переменную (m_wndImportMode) и переменную значения (m_nImportMode).Сопоставление поля со списком в диалоговом окне MFC

Я могу использовать обе переменные просто отлично. И я могу использовать переменную управления, чтобы заполнить элемент управления просто отлично. Моя проблема в том, где правильное место для заполнения моего контроля?

Если я заполнил поле со списком до DoDataExchange(), тогда моя контрольная переменная еще не была инициализирована. Если я заполняю поле со списком после DoDataExchange(), он заполняется штрафом, но значение не устанавливается.

BOOL COptionsDlg::OnInitDialog() 
{ 
    // If I populate my combo box here, 
    // my control variable is not yet available 

    // This will ultimately call DoDataExchange() 
    CDialog::OnInitDialog(); 

    // If I populate my combo box here, 
    // DoDataExchange() has already been called and 
    // so it will not have selected the correct item 
    // before there were any items 

    return TRUE; // return TRUE unless you set the focus to a control 
} 

Играя с этим немного больше, я могу видеть, что я могу заполнить контроль перед вызовом CDialog::OnInitDialog(), если я использую GetDlgItem() вместо моей управляющей переменной (который еще не был инициализирован), а затем пункт по умолчанию будет правильно быть установленным, как я хочу. Но разве среда MFC не предусматривает заполнение элементов управления списком в диалоговом окне и по-прежнему с использованием DoDataExchange()?

+0

Отправьте свой код. Вы должны иметь возможность заполнять 'CComboBox', используя' AddString() 'просто отлично после' OnInitDialog() '. Нет ничего плохого в механизме DoDataExachange и в структуре MFC в целом. –

+0

Я использовал это в течение многих лет и не имел ни одной из ваших проблем. Я никогда не называю 'DoDataExchange' напрямую; в функции, которую вы заполняете комбо, вы должны вызывать 'UpdateData (FALSE)' после. – sergiol

+0

@sergiol: Я никогда не называл 'DoDataExchange()' напрямую. Но я могу видеть в 'OnInitDialog()' где 'CDialog :: OnInitDialog()' (где 'DoDataExchange()') вызывается. И я могу заполнить контроль до или после этого. И я заполняю его в 'OnInitDialog()'. Где вы его заполняете? –

ответ

0

Я решил это, используя GetDlgItem(), чтобы извлечь поле со списком, а затем заполнить его до вызова CDialog::OnInitDialog(). Это работает по назначению.

Я не уверен, что бы я делал иначе, если это не проблема для кого-либо еще.

+1

Да, это сработает, потому что 'CDialog :: OnInitDialog' вызывает' UpdateData (FALSE) '. Но я бы не стал писать код перед 'CDialog :: OnInitDialog'. Поместите все после 'CDialog :: OnInitDialog' и вызовите' UpdateData (FALSE) 'в конце. Также я бы использовал 'm_combo.SubclassDlgItem (IDC_COMBO1, this)' вместо 'GetDlgItem' или добавить' DDX_Control (pDX, IDC_COMBO1, m_combo) ' –

+0

Но мне не нравится тот факт, что UpdateData() затем будет вызываться дважды , Код работает отлично, но я ожидал, что вы сделаете это способом MFC, но все же сможете эффективно заполнять мой контроль. –

Смежные вопросы