ShIvADeSt да в том то и дело, я для проверки спрашивал, сам я вижу, что одно и то же и в бреде и у меня. Существенный момент есть такой - бред большой файл начинает отображать еще и не загрузив полностью, у меня же только после полной практически загрузки - отсюда визуальная разница.
http://vito.rbcmail.ru/Mark2.exe попробуй драг"н"дропом кинуть в эту прогу файл габаритный - в статбаре будут сообщения: "file was read" - файл считан в ReadFile-ом в буфер в памяти, "converted" - весь буфер конвертирован в юникод, "ready" - файл полностью загружен из буфера в ричедит. Так вот скорость загрузки в рич даже из памяти очень невысока. Правда ричедит юникодовый, но я сравнивал с обычным - разницы нет. Я проверил - загрузка в ричедит идет кусками по 4096 байт, итого на файле 26 мб - несколько десятков тыс. операций по 4096 б. Не могу понять, из памяти он медленнее грузится, что ли, чем с диска. Я перешел на юникодовый контрол, а посему мне напрямую загрузка не подходит - юникод так не реализуешь, все равно конвертить надо, а значит - буфер нужен.
Попробую сейчас напрямую с диска в рич грузить, сравню, хотя я по-моему уже пробовал.
Добавлено BOOL File_Load(LPCTSTR fullfilename)
{
EDITSTREAM es = {0};
HANDLE hfile;
HWND hRTF,hwnd;
DWORD bufSize, bytesReaded;
PCHAR pBuf;
LPDOC_INFO pDI;
TCHAR fn[MAX_PATH]={0};
lstrcpy(fn,fullfilename);
hfile = CreateFile(fullfilename,GENERIC_READ,0,0,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);
if (hfile == INVALID_HANDLE_VALUE) return FALSE;
// готовим структуру
ZeroMemory(&BufInfo,sizeof(BufInfo));
// получаем размер файла
BufInfo.BufSize = bufSize = GetFileSize(hfile,0);
// проверяем, годится ли текущее окно для загрузки документа?
if (hwnd = hActiveMdiWnd())
{
// получаем адрес структуры данных окна
pDI = ptrWNDSTRUCT(hwnd);
// есть активное мди-окно - проверяем его РТФ
GETTEXTLENGTHEX tl;
hRTF = hActiveRTF(hwnd);
tl.flags = GTL_NUMCHARS;
tl.codepage = CP_ACP;
// если длина текста в РТФ != 0, то создаем новое окно
if (SNDMSG(hRTF, EM_GETTEXTLENGTHEX, (WPARAM)&tl, 0))
{
// создаем новое окно для открываемого файла
hwnd = Child_Window_New((LPCTSTR)fn);
}else{
// поправляем заголовок окна
SetWindowText(hwnd,fn);
// set new tab title
Tab_ChangeTitle( mainTabBar.hTabBar,1111,fn);
}
}
else // нет активного мди-окна
{
// создаем новое окно для открываемого файла
hwnd = Child_Window_New((LPCTSTR)fn);
// получаем адрес структуры данных окна
pDI = ptrWNDSTRUCT(hwnd);
}
// вычисляем хэндл ричедита
hRTF = hActiveRTF(hwnd);// di->hwnd_RTF;
// готовим структуру для EM_STREAMIN
es.dwCookie = (DWORD_PTR)hfile;
es.pfnCallback = &LoadFileCallBack2;
// загружаем файл
long rtfmask = SendMessage (hRTF,EM_SETEVENTMASK,0,0);
SNDMSG(hRTF, EM_STREAMIN,(WPARAM)(UINT)SetStreaminFlags(fn),(LPARAM)(EDITSTREAM FAR *) &es);
SendMessage (hRTF,EM_SETEVENTMASK,0,rtfmask);
// закрываем хэндл считанного файла
CloseHandle(hfile);
// ставим флаг, что файл не изменялся
SNDMSG(hRTF, EM_SETMODIFY,(WPARAM)FALSE,(LPARAM)0);
ToolBar_Buttons_SetState(hRTF);
// сохраняем в список MRD
MRD_save((LPTSTR)fn);
return TRUE;
}
static DWORD CALLBACK
LoadFileCallBack2(DWORD dwCookie, // application-defined value
LPBYTE lpBuffer, // pointer to a buffer
LONG lSize, // number of bytes to read or write
LONG *plRead) // pointer to number of bytes transferred
{
if(!lSize) return 1;
if(!ReadFile((HANDLE) dwCookie,lpBuffer, lSize, (LPDWORD) plRead, NULL))
return -1;
return 0;
}
вот собсно загрузка в обычный ричедит контрол.
на 26 мб файл тхт ~5-6 сек.