使用CComboBox时,初始化数据慢的问题(二)
前几天一直以为是动态生成控件导致程序初始化变慢。经过几天调试,发现是使用CComboBox中AddString浪费了程序初始化绝大部分的时间。
这里有个半年前的帖子《使用CComboBox时,初始化数据慢的问题》
http://topic.csdn.net/u/20100210/13/3a4aaf86-1310-4661-8599-21539803fa18.html
我专门做了个测试程序,仅初始化CComboBox就用了接近6秒。如果多几个这样的界面,耗时不可想象。
进一步采用了SetRedraw和InitStorage,以及用InsertString替换AddString。节省了也就50%左右的时间,也需要三秒多。
非常困惑,为什么动态初始化和非动态初始化数据时间差别那么大?有没有比较彻底的解决之道?谢谢!
初始化CComboBox数据代码如下:
void CTestComboMenuDlg::InitComboMenu(void){ CString str = _T(""); CString strD; int num = 32; DWORD dwStart = ::GetTickCount(); //初始时间 for(int i=0; i<num; i++) { m_Combo1[i].ResetContent();//消除现有所有内容 m_Combo2[i].ResetContent(); m_Combo3[i].ResetContent(); } for (int i=0; i<num; i++) { m_Combo1[i].InitStorage(33,10); m_Combo3[i].InitStorage(33,10); m_Combo1[i].SetRedraw(FALSE); m_Combo3[i].SetRedraw(FALSE); for (int j=1; j<33; j++) { str.Format(_T("%d"),j); str = _T(" 输入") + str; //m_Combo1[i].AddString(str); m_Combo1[i].InsertString(j-1,str); str = _T(""); str.Format(_T("%d"),j); str = _T(" 输出") + str; m_Combo3[i].AddString(str); //m_Combo3[i].InsertString(j-1,str); } m_Combo1[i].SetRedraw(TRUE); m_Combo3[i].SetRedraw(TRUE); } for(int i=0; i<num; i++) { m_Combo2[i].InitStorage(33,10); m_Combo2[i].SetRedraw(FALSE); for(int j=1;j<=401;j++) { strD.Format(_T("%d"),j); strD += _T(" ch"); //m_Combo2[i].AddString(strD); m_Combo2[i].InsertString(j-1,strD); } m_Combo2[i].SetRedraw(TRUE); } DWORD dwEnd = ::GetTickCount() - dwStart; //结束时间}