我需要显示一个对话框,这个对话框里也只是一些普通控件:Static、Button、CtrlList、ComboBox控件。
对话框在加载时需要从网络读取相关数据,我把读取到的数据放设置成各个控件的文本,但是在800 * 600分辨率下(1024 * 800 效果不错)界面的显示给人的感觉就是“很卡”,有些控件显示的会比较慢,因此整个界面初始化时效果比较难看。不知道这是什么原因,该如何解决?我个人觉得可能与读取网络数据有关。没有读取数据前按照流程会显示一部分控件,然后读取网络数据,然后更新控件内容(这些就是卡的地方了)。我想大家也可能会遇到类似的问题,请问该如何解决这个问题?谢谢!!
BOOL CExChange::OnInitDialog() 
{
    CDialog::OnInitDialog();    // 会员卡
    SetDlgItemText( IDC_EDIT_CARD_NO, cardNO );    // 兑换日期
    CTime time = CTime::GetCurrentTime();
    SetDlgItemText( IDC_EDIT_DATE, time.Format( "%Y-%m-%d" ) );    // 设置组合框高度
    m_cmbStock.SendMessage( CB_SETITEMHEIGHT, 0, 25 );
    m_cmbCurrentPage.SendMessage( CB_SETITEMHEIGHT, 0, 25 );    // 创建占位图像列表 [ 改变CListCtrl行高度用 ]
    CSyxPosApp *pApp = (CSyxPosApp *)AfxGetApp();
    m_imagelist.Create( 30, 30, ILC_COLOR, 2, 2 );
    m_imagelist.Add( pApp->LoadIcon(IDI_ICON_UNCHECKED) );
    m_imagelist.Add( pApp->LoadIcon(IDI_ICON_CHECKED) );    // 修改ListCtrl控件样式
    DWORD OldStyle = m_listExchange.GetExtendedStyle();
    m_listExchange.SetExtendedStyle( OldStyle | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | WS_EX_STATICEDGE );
    m_listExchange.SetImageList( &m_imagelist, LVSIL_SMALL );
        
    // 设置ListCtrl头内容
    m_listExchange.InsertColumn( 0, _T("序号"), LVCFMT_LEFT | LVCFMT_IMAGE, 80 );
    m_listExchange.InsertColumn( 1, _T("商品名称"), LVCFMT_LEFT, 195 );
    m_listExchange.InsertColumn( 2, _T("单件积分"), LVCFMT_CENTER, 125 );
    m_listExchange.InsertColumn( 3, _T("数量"), LVCFMT_CENTER, 125 );
    m_listExchange.InsertColumn( 4, _T("库存"), LVCFMT_CENTER, 125 );
    m_listExchange.InsertColumn( 5, _T("兑换积分"), LVCFMT_CENTER, 125 );
    
    // 获取卡信息
    int ret = 0, len = 0;
    CStringArray cardInfoTerms;
    char* cardInfoResult = getCardInfo( carddata1, carddata2, carddata3, &ret );
    {
        ...
            // 用户名
            SetDlgItemText( IDC_EDIT_USERNAME, cardInfoTerms[6] );            // 所属店铺
            SetDlgItemText( IDC_EDIT_SHOP_NAME, cardShopName );
    }
    // 刷新ListCtrl控件内容
    Refresh();    // 初始化记录数文本框
    sprintf( szBuffer, "共有 %d 条记录", m_totalRecords );
    SetDlgItemText( IDC_STATIC_RECORDS, szBuffer );
    
    // 初始化页面跳转组合框
    m_cmbCurrentPage.ResetContent();
    for( int i = 1; i <= m_totalPage; i++ )
    {
        sprintf( szBuffer, "第%d页", i );
        m_cmbCurrentPage.AddString( szBuffer );
    }
    m_cmbCurrentPage.SetCurSel( 0 );    return TRUE;
}

解决方案 »

  1.   

    你读取网络数据的部分,代码不要在OnInitDialog里面调用,可以PostMessage到另外的函数调用,或者直接开个另外的线程,读取网络数据,然后刷新界面。
      

  2.   

    因为我要查询数据,假设有数据则显示对话框,如果没有数据只是弹出一个MessageBox。但是如果采用多线程的话,这样好像对话框是必须要都显示出来的啊。我的意思是在窗口刷新部分有没有比较好的处理方法,例如先禁止刷新后来在刷新。