Ich habe ein Kombinationsfeld zu meinem MFC-Dialogfeld hinzugefügt. Und ich habe sowohl eine Steuervariable (m_wndImportMode
) und eine Wertvariable (m_nImportMode
) hinzugefügt.Popup-Kombinationsfeld in MFC-Dialogfeld
Ich kann beide Variablen gut verwenden. Und ich kann die Steuervariable verwenden, um das Steuerelement gut zu füllen. Mein Problem ist, wo ist der richtige Ort, um meine Kontrolle zu füllen?
Wenn ich das Kombinationsfeld vor DoDataExchange()
auffüllen, dann wurde meine Steuervariable noch nicht initialisiert. Wenn ich das Kombinationsfeld nach DoDataExchange()
auffüllen, füllt es gut, aber der Wert wird nicht festgelegt.
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
}
mit diesem ein wenig mehr spielen, ich sehe ich die Kontrolle bevölkern kann CDialog::OnInitDialog()
vor dem Aufruf, wenn ich GetDlgItem()
statt meiner Regelgröße verwenden (die noch nicht initialisiert wurde), und dann wird das Standardelement korrekt so eingestellt werden wie ich will. Aber bietet das MFC-Framework nicht die Möglichkeit, Listensteuerelemente in einem Dialogfeld zu füllen, und immer noch mit DoDataExchange()
?
Geben Sie Ihren Code ein. Sie sollten 'CComboBox' mit' AddString() 'einfach nach' OnInitDialog() 'auffüllen können. Es ist nichts falsch mit 'DoDataExachange' Mechanismus und MFC Framework im Allgemeinen. –
Ich habe das seit Jahren verwendet und hatte keine Ihrer Probleme. Ich rufe 'DoDataExchange' niemals direkt an; In der Funktion, in der Sie die Combo füllen, sollten Sie 'UpdateData (FALSE)' danach aufrufen. – sergiol
@sergiol: Ich habe 'DoDataExchange()' auch nie direkt aufgerufen. Aber ich kann in OnInitDialog() sehen, wo 'CDialog :: OnInitDialog()' (wo 'DoDataExchange()') aufgerufen wird. Und ich kann die Kontrolle davor oder danach bevölkern. Und ich bevölkere es in 'OnInitDialog()'. Wo bevölkern Sie es? –