visual-c++ - selezione - vba combobox1 listindex




Come caricare una vasta gamma di stringhe in un controllo combobox MFC il più veloce possibile? (4)

Ho una matrice di 1000 stringhe da caricare in una casella combinata. Qual è il modo più veloce per caricare l'array di stringhe nella casella combinata?

C'è un modo diverso dall'iterazione sull'elenco di stringhe, mettendo ogni stringa nella casella combinata una alla volta?

E come copiare i dati della casella combinata una volta caricati in altre 10 caselle combinate?


Non sono a conoscenza di alcun modo per caricare più stringhe atomicamente, ma ci sono un paio di cose che puoi fare per rendere il processo più efficiente:

  • Chiama CComboBox :: InitStorage prima di aggiungere elementi per pre-allocare memoria
  • Utilizzare InsertString anziché AddString per impedire l'attivazione di un ordinamento su ogni aggiunta (presupponendo che lo stile CBS_SORT sia abilitato)

Se hai 1000 stringhe ripetute in 10 caselle combinate, potresti prendere in considerazione l'utilizzo di una combo box disegnata dal proprietario, che disegna le stringhe al volo in base agli indici nell'array, piuttosto che memorizzarle nella casella combinata. Molto più veloce, più efficiente in termini di memoria. Controlla il metodo DrawItem e la struttura DRAWITEMSTRUCT nella guida in linea. Fondamentalmente, si dovrebbe fare qualcosa come usare InitStorage e InsertString (come menzionato da NuSonic) per creare i 1000 elementi vuoti nel combobx e sovrascrivere DrawItem per estrarre e disegnare la stringa richiesta, in base all'indice, in quanto deve essere disegnata.


Ho avuto questo problema e l'ho risolto in due modi, a seconda degli elementi #. L'impostazione di non disegnare e avviare la memorizzazione non ha fatto alcuna differenza per me. Anche fare in modo che un proprietario ne tragga uno è fattibile, ma avevo un sacco di combobox. Supponendo una lista fissa per ogni casella combinata, che non cambia contenuto, la lista viene impostata una volta.

# Articoli molto grandi: Crea la casella combinata come Semplice / Disabilitata con SetWindowText per impostare la stringa iniziale e un piccolo pulsante accanto ad essa apre una finestra di dialogo che ti consente di scegliere l'elemento da un controllo di elenco in modalità Report dei dati che sarebbe Sono stato nella casella combinata (potrebbe essere qualcosa fatto nel dialogo).

Articoli # moderati: creati una classe combobox derivata personalizzata che sovrascrive AddString, SelectString e gestisce OnDropDown. Quando aggiungi elementi, li mette in un vettore temporaneo, quindi su SelectString (potrebbe eseguire l'override di SetCurSel), aggiunge un elemento che trova e seleziona. Quando si abbassa, quindi reimposta la casella combinata e aggiunge tutti gli elementi e seleziona quello attualmente selezionato. C'è un leggero rallentamento nel rilasciare la casella combinata, ma su una bassa quantità di elementi non è evidente.

Ha reso i miei dialoghi caricati molto più velocemente e sono ancora perfettamente funzionanti senza il draw del proprietario.


Prenderò in considerazione l'utilizzo di un elenco di selezione anziché di una casella combinata per le prestazioni.

Una regola generale per migliorare le prestazioni quando si inseriscono molti elementi in un elenco di interfaccia utente è chiamare prima dell'inserimento e impostarlo su true dopo.

Ecco la sintassi corretta

#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: migliorare la soluzione per includere suggerimento smacl





arrays