2016-12-10 3 views
0

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()?

+0

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. –

+0

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

+0

@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? –

Antwort

0

Ich löste dies mit GetDlgItem(), um das Kombinationsfeld abzurufen und dann zu befüllen, bevor CDialog::OnInitDialog() aufgerufen wird. Dies funktioniert wie vorgesehen.

Ich bin mir nicht sicher, was ich anders machen könnte, wenn dies kein Problem für andere ist.

+1

Ja, das würde funktionieren, weil 'CDialog :: OnInitDialog' 'UpdateData (FALSE)' aufruft. Aber ich würde es vermeiden, Code vor 'CDialog :: OnInitDialog' zu schreiben. Setze alles nach 'CDialog :: OnInitDialog' und rufe' UpdateData (FALSE) 'am Ende auf. Außerdem würde ich 'm_combo.SubclassDlgItem (IDC_COMBO1, this)' anstelle von 'GetDlgItem' verwenden oder' DDX_Control (pDX, IDC_COMBO1, m_combo) hinzufügen ' –

+0

Aber ich mag es nicht, dass UpdateData() dann zweimal aufgerufen würde . Der Code funktioniert gut, aber ich habe eine Möglichkeit erwartet, die MFC-Methode zu verwenden, aber trotzdem in der Lage zu sein, meine Kontrolle effizient zu füllen. –