本帖最后由 ziyuanxiazai123 于 2012-02-28 19:54:36 编辑

解决方案 »

  1.   

    谢谢  我理解你说的seek文件指针方法 我在上面提到了如果利用文件指针读取一部分数据 不是利用回调函数读取一部分 那样会耗费时间  
    回调函数的特点  我感觉就是一读就全部读完 不能停下除非错误或文件结束
    利用回调函数EditStreamCallback循环调用时,它并不停下来,一切都是有空间本身控制  用户没有多大自由定制这个回调函数 
     怎么在适当时候结束回调函数呢?
      

  2.   

    我最终找到的两种方法如下:
    方法一
    long CRichEditCtrlEx::StreamIn(CString &str)
    {  
       if(!str.IsEmpty())
       {
    EDITSTREAM es;
    es.dwCookie =(DWORD)&str;
    es.pfnCallback = StreamInCallback; 
    return CRichEditCtrl::StreamIn(SF_TEXT, es);
       }
       else
       return 0;
    }
    DWORD CALLBACK CRichEditCtrlEx::StreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
    {
       CString *pstr = (CString *)dwCookie; if( pstr->GetLength() < cb )
    {
    *pcb = pstr->GetLength();
    memcpy(pbBuff, (LPCSTR)*pstr, *pcb );
    pstr->Empty();
    }
    else
    {
    *pcb = cb;
    memcpy(pbBuff, (LPCSTR)*pstr, *pcb );
    *pstr = pstr->Right( pstr->GetLength() - cb );
    }
    return 0;
    }
    方法二:
    long CRichEditCtrlEx::StreamIn(CString &str)
    {  
       if(!str.IsEmpty())
       {
       SetSel(0, -1);
       ReplaceSel(str);
       return str.GetLength();
       }
       else
       return 0;
    }
    以上方法可用,但不一定是最好的。