Wie eine große Palette von Strings in zu einer MFC-Combobox Steuerung schnell wie möglich zu laden?

StackOverflow https://stackoverflow.com/questions/229395

Frage

Ich habe ein Array von 1000 Strings in ein Kombinationsfeld zu laden. Was ist der schnellste Weg, um die Array von Strings in die Combo-Box zu laden?

Gibt es irgendeine andere Weise als über die Liste von Strings iterieren, jede Zeichenfolge in das Kombinationsfeld einen nach dem anderen setzen?

Und wie die Combo-Box Daten kopieren einmal auf einige 10 anderen Kombinationsfelder geladen?

War es hilfreich?

Lösung

Wenn Sie 1000 Strings in 10 Comboboxen wiederholt haben, möchten Sie vielleicht mit einem Eigentümer gezeichnet Combobox prüfen, die die Saiten on the fly auf Indizes in Ihrem Array basiert zieht, anstatt sie in der Combobox überhaupt zu speichern. Art und Weise schneller, viel mehr Speicher effizienter zu gestalten. Schauen Sie sich die DrawItem Methode und DRAWITEMSTRUCT Struktur in der Online-Hilfe. Grundsätzlich würden Sie etwas tun, wie mit Initstorage und Insert (wie durch NuSonic erwähnt) Ihre 1000 leer Artikel in Ihrem combobx zu erstellen, und außer Kraft setzen DrawItem extrahieren und die erforderliche Zeichenfolge, basierend auf Index zu ziehen, wie es gezeichnet werden muss.

Andere Tipps

Ich bin mir nicht bewusst irgendeine Weise atomar mehrere Strings zu laden, aber es gibt ein paar Dinge, die Sie tun können, um den Prozess effizienter zu machen:

  • Rufen Sie CComboBox :: Initstorage vor Hinzufügen von Elementen Speicher vorbelegen
  • Verwenden Sie Insert statt AddString auf jeder Zugabe eine Art zu verhindern Auslösung (vorausgesetzt, die CBS_SORT Stil aktiviert ist)

Möglicherweise schneller als CComboBox mit DrawItem wäre ein Eigentümer sein Daten CListCtrl . Dies würde auch dazu dienen, Ihr Ziel, eine Teilmenge der Elemente in andere Listen zu duplizieren, da eine gemeinsame Datenquelle verwendet werden könnte.

Ich schlage vor, weil ein 1000 Artikel CComboBox ist nicht sehr brauchbar sein wird.

Ich werde prüfen, eine Auswahlliste anstelle ein Kombinationsfeld für die Leistung.

Eine allgemeine Faustregel gilt: Leistung zu verbessern, wenn viele Artikel in einer UI-Liste eingefügt wird vor dem Einsetzen rufen und es wieder auf true nach der Einstellung.

Hier ist die korrekte Syntax

#define NB_ITEM 1000
#define ITEM_LENGTH 10

void CMFCComboDlg::InitMyCombo()
{
    CString _strData;
    m_cbMyCombo.SetRedraw( FALSE );

    m_cbMyCombo.Clear();

    m_cbMyCombo.InitStorage(NB_ITEM, ITEM_LENGTH); 

    for( int i = 0; i < NB_ITEM; i++ )
    {
        _strData.Format( L"Test %ld", i );
        m_cbMyCombo.InsertString( i, _strData );
    }

    m_cbMyCombo.SetCurSel(0);

    m_cbMyCombo.SetRedraw( TRUE );
}

EDIT: Verbessern Sie die Lösung smacl Vorschlag schließen

Ich hatte dieses Problem und löste es auf zwei Arten, auf die Anzahl Elemente abhängig. Einstellung nicht ziehen und init Speicher machte überhaupt keinen Unterschied für mich. ein Eigentümer ein Unentschieden zu machen ist auch durchführbar, aber ich hatte eine Tonne Comboboxen. Unter der Annahme einer festen Liste für jede Combobox, die Inhalte nicht ändert, wird die Liste gesetzt einmal.

Sehr große Anzahl Elemente: Hergestellt nur die Combo-Box mit SetWindowText Einfach / deaktiviert wird anfängliche Zeichenfolge zu setzen und einen kleinen Knopf neben ihm einen Dialog geöffnet, sodass Sie die Artikel aus einer Liste Steuerung im Berichtsmodus der Daten auswählen, die in der Combo gewesen wäre Box (alles sein im Dialog geschehen könnte).

Mittel # Artikel: Eine benutzerdefinierte Combobox Klasse abgeleitet, die überschreibt AddString, Select und Griffe OnDropDown. Wenn Sie Elemente hinzufügen, sie sie in einen temporären Vektor setzt, und dann auf Select (könnte auch tun SetCurSel außer Kraft setzen), fügt es ein Element, um es und wählt findet. Wenn nach unten fallen, dann setzt er den Combobox und fügt alle Einzelteile, die und aktuell ausgewählte wählt. Es gibt leichte Abschwächung auf die Combobox fallen, aber auf geringe Mengen von Elementen ist nicht erkennbar.

Es machte meine Dialoge laden viel schneller und immer noch voll, ohne Eigentümer draw funktionsfähig sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top