5

コンボ ボックスに読み込む 1000 個の文字列の配列があります。文字列の配列をコンボ ボックスにロードする最速の方法は何ですか?

文字列のリストを反復処理して、各文字列を一度に 1 つずつコンボ ボックスに入れる以外の方法はありますか?

また、一度読み込まれたコンボ ボックスのデータを他の 10 個のコンボ ボックスにコピーする方法はありますか?

4

5 に答える 5

6

10 個のコンボボックスで 1,000 個の文字列が繰り返されている場合、コンボボックスにまったく格納するのではなく、インデックスに基づいてその場で文字列を配列に描画する、所有者描画コンボボックスの使用を検討することをお勧めします。はるかに高速で、メモリ効率が向上します。オンライン ヘルプでDrawItemメソッドとDRAWITEMSTRUCT構造を調べてください。基本的には、InitStorageInsertString (NuSonic で述べたように) を使用してコンボボックスに 1000 個の空白のアイテムを作成し、DrawItem をオーバーライドて、必要なインデックスに基づいて必要な文字列を抽出して描画します。

于 2008-10-23T12:50:58.890 に答える
2

複数の文字列をアトミックにロードする方法はわかりませんが、プロセスをより効率的にするためにできることがいくつかあります。

  • 事前割り当てメモリにアイテムを追加する前に、CComboBox::InitStorageを呼び出します
  • AddStringの代わりにInsertStringを使用して、追加ごとにソートがトリガーされないようにします(CBS_SORTスタイルが有効になっていると仮定)
于 2008-10-23T12:04:13.727 に答える
1

DrawItemを使用したCComboBoxよりもおそらく高速なのは、所有者データCListCtrlです。これは、共通のデータソースを使用できるため、アイテムのサブセットを他のリストに複製するという目標にも役立ちます。

1000アイテムのCComboBoxはあまり使い勝手が悪いので、これをお勧めします。

于 2008-10-24T00:09:12.840 に答える
0

パフォーマンスのために、コンボボックスの代わりに選択リストを使用することを検討します。

UIリストに多くのアイテムを挿入するときのパフォーマンスを向上させるための一般的な経験則は、挿入前に呼び出し、挿入後にtrueに戻すことです。

正しい構文は次のとおりです

#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 );
}

編集:smaclの提案を含めるようにソリューションを改善する

于 2008-10-23T12:05:49.540 に答える