Хочется концептуально понять, можно ли быстро сделать сабж штатными средствами? Т.е. количество велосипеда свести к минимуму.
Задумка примерно такая. Вот есть консоль cmd, туда текст может сыпаться огромными количествами, просто через printf, добавляется в хвост, его там можно скроллить, копировать.
Хочется такой же EDIT.
Вот есть виртуальный ListView32, которому только размер меняешь и обрабатывает колбак для подачи информации в ячейки. В качестве буфера — std::vector. Удобно. Но нельзя скопировать
Сама задача примерно такая: есть консольное приложение, которое в пайпу сыпет астрономические объёмы текста(клиент БД), есть Win32 оконное приложение, которое установило потоки ввода-вывода на себя (чтобы разделить окно ввода и вывода, чтобы удобнее было вводить команды и так далее) и вот теперь ему надо как-то справляться с объёмом информации, быстро его выводить, но пока для вывода используется read-only Edit, и это всё дико тормозит на больших объёмах в wm_settext. Вставка текста в хвост работает быстро (интересно, как это внутри), но у меня read-only.
PS: пока набирал пост, просмотрел stackoverflow, ничего не нашёл, кроме как "сделать свой".
Здравствуйте, CEMb, Вы писали: CEM>Сама задача примерно такая: есть консольное приложение, которое в пайпу сыпет астрономические объёмы текста(клиент БД), есть Win32 оконное приложение, которое установило потоки ввода-вывода на себя (чтобы разделить окно ввода и вывода, чтобы удобнее было вводить команды и так далее) и вот теперь ему надо как-то справляться с объёмом информации, быстро его выводить, но пока для вывода используется read-only Edit, и это всё дико тормозит на больших объёмах в wm_settext. Вставка текста в хвост работает быстро (интересно, как это внутри), но у меня read-only.
CEM>PS: пока набирал пост, просмотрел stackoverflow, ничего не нашёл, кроме как "сделать свой".
Посмотри в сторону RichEdit'а и в частности EM_REPLACESEL.
Если склероз не подводит, то похожую задачу делали именно через него.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Здравствуйте, CEMb, Вы писали: CEM>>Сама задача примерно такая: есть консольное приложение, которое в пайпу сыпет астрономические объёмы текста(клиент БД), есть Win32 оконное приложение, которое установило потоки ввода-вывода на себя (чтобы разделить окно ввода и вывода, чтобы удобнее было вводить команды и так далее) и вот теперь ему надо как-то справляться с объёмом информации, быстро его выводить, но пока для вывода используется read-only Edit, и это всё дико тормозит на больших объёмах в wm_settext. Вставка текста в хвост работает быстро (интересно, как это внутри), но у меня read-only.
CEM>>PS: пока набирал пост, просмотрел stackoverflow, ничего не нашёл, кроме как "сделать свой".
SVZ>Посмотри в сторону RichEdit'а и в частности EM_REPLACESEL. SVZ>Если склероз не подводит, то похожую задачу делали именно через него.
Решение с RichEdit вполне рабочее. Но вот сделать RichEdit виртуальным как ListView так просто не получится.
Почему нельзя скопировать из ListView? Контекстное меню есть, выделенные строки тоже можно получить. Если напрячься, можно нарисовать и выделение по буквам. Ну, а копировать в буфер обмена — тривиально.
Здравствуйте, CEMb, Вы писали: CEM>Задумка примерно такая. Вот есть консоль cmd, туда текст может сыпаться огромными количествами, просто через printf, добавляется в хвост, его там можно скроллить, копировать.
RichEdit умеет добавление через EM_STREAMIN.
Там в структуре EDITSTREAM указывается callback и можно данные подавать из std::vector, std::istrstream и т.п.
Использовал такую штуку для вывода логов на экран. Работает вполне приемлемо на миллионах строчек.
Здравствуйте, qaz77, Вы писали:
Q>RichEdit умеет добавление через EM_STREAMIN. Q>Там в структуре EDITSTREAM указывается callback и можно данные подавать из std::vector, std::istrstream и т.п.
Q>Использовал такую штуку для вывода логов на экран. Работает вполне приемлемо на миллионах строчек.
А вертикальный скрроллинг в таком RichEdit как тогда отслеживать\реализовывать?
Здравствуйте, flаt, Вы писали:
F>Почему нельзя скопировать из ListView? Контекстное меню есть, выделенные строки тоже можно получить. Если напрячься, можно нарисовать и выделение по буквам. Ну, а копировать в буфер обмена — тривиально.
Нельзя скопировать с произвольной позиции до произвольной. Т.е, к примеру, текст от середины первой строки до середины второй. И я не уверен, что ListView с режимом редактирования может использоваться одновременно с виртуальным fixed size, ему же там для отрисовки текста колбак нужен. Ну и сам ListView по виду и интерактиву сильно отличается от Edit-а.
F>Если напрячься, можно нарисовать и выделение по буквам.
Если уж напрягаться, то можно тогда просто свой Edit забабахать хотелось минимально что-то своё делать.
Здравствуйте, Carc, Вы писали: C>А вертикальный скрроллинг в таком RichEdit как тогда отслеживать\реализовывать?
В смысле чтобы последняя строчка всегда была видна?
Сначала колдую с EM_GETFIRSTVISIBLELINE, EM_GETLINECOUNT и EM_LINEINDEX,
а потом делаю EM_LINESCROLL на вычисленное количество строк.
Здравствуйте, qaz77, Вы писали:
Q>Здравствуйте, Carc, Вы писали: C>>А вертикальный скрроллинг в таком RichEdit как тогда отслеживать\реализовывать?
Q>В смысле чтобы последняя строчка всегда была видна? Q>Сначала колдую с EM_GETFIRSTVISIBLELINE, EM_GETLINECOUNT и EM_LINEINDEX, Q>а потом делаю EM_LINESCROLL на вычисленное количество строк.
Нет. Это-то раз фигня… Там вариантов туча: скролл-туды, скролл-сюды, TOM-интерфейсы, EM_EXSETSEL, EM_LINESCROLL и прочия…
А вот как сделать так?
1) Чтобы если первая строка в RichEdit уже видна (скажем, текущее выделение {0,0}).
2) Но де факто эта первая видимая строка вовсе не первая.
Потому как где-то во внешнем источнике данных для такого "виртуального" RichEdit, есть еще предыдущие Икс строк данных для отображения.
Вот как сделать, чтобы именно сам вертикальный скроллер Ричэдита показывал возможность скрольнуться выше? То бишь в те самые предыдущие Икс строк, в порцию данных (того же лога)?
Здравствуйте, Carc, Вы писали:
C>Потому как где-то во внешнем источнике данных для такого "виртуального" RichEdit, есть еще предыдущие Икс строк данных для отображения.
C>Вот как сделать, чтобы именно сам вертикальный скроллер Ричэдита показывал возможность скрольнуться выше? То бишь в те самые предыдущие Икс строк, в порцию данных (того же лога)?
Не-не. Никакой виртуальности там нет. RichEdit самый обычный и скроллинг показывает все строки.
Потоковый ввод — это просто один из способов забить контрол текстом.
У ТС с обычным Edit проблема, что каждый раз делается GetWindowText, append добавки, SetWindowText, а это медленно.
Для какого-то мелкого вывода, где ожидается порядка десяти строчек, я тоже так делаю с readonly Edit.
Здравствуйте, qaz77, Вы писали:
Q>Здравствуйте, Carc, Вы писали:
C>>Потому как где-то во внешнем источнике данных для такого "виртуального" RichEdit, есть еще предыдущие Икс строк данных для отображения.
C>>Вот как сделать, чтобы именно сам вертикальный скроллер Ричэдита показывал возможность скрольнуться выше? То бишь в те самые предыдущие Икс строк, в порцию данных (того же лога)?
Q>Не-не. Никакой виртуальности там нет. RichEdit самый обычный и скроллинг показывает все строки. Q>Потоковый ввод — это просто один из способов забить контрол текстом.
А это-то… Ну тогда это никакой не виртуальный RichEdit! Чего тогда городить огород было с EM_STREAMIN?
Q>У ТС с обычным Edit проблема, что каждый раз делается GetWindowText, append добавки, SetWindowText, а это медленно. Q>Для какого-то мелкого вывода, где ожидается порядка десяти строчек, я тоже так делаю с readonly Edit.
Дык добавлять и в Edit можно…
Делов-то, йопта?
EM_SETSEL (-1 , -1) + EM_REPLASESEL();
Это и Edit все умеет, ну и RichEdit тоже само собой.
Хотя про выбор RichEdit я все равно согласен.
1) Запас памяти под внутренний буфер у него в разы больше. Одно это уже склоняет к выбору.
2) Манипуляшки с TOM-интерфейсами дают больший выбор возможностей на порядок. Уже хорошо!
3) Маскировка событий (EM_SETEVENTMASK): причем можно и на лету (выключил-сделал-включил)
4) Ну и само собой возможности на вырост: минимальное форматирование (bold, italic). Автоподсветка гиперссылок. Ну и всякие синтаксические подсветки приделываются к RichEdit на раз, за подня-день.
Здравствуйте, Carc, Вы писали:
C>Дык добавлять и в Edit можно… C>Делов-то, йопта? C>
C>EM_SETSEL (-1 , -1) + EM_REPLASESEL();
C>
C>Это и Edit все умеет, ну и RichEdit тоже само собой.
Это все известно, но порождает другие проблемы.
Надо запоминать, что у пользователя было выделено, потом восстанавливать.
Скроллинг также запоминать-восстанавливать.
Плюс EM_STREAMIN в том, что ничего никуда не прокручивает.
Выделение и позиция скроллинга остаются какими были.
Если нужно куда-то прокрутить, то делаем это руками.
В моем окошке вывода видимость последней строки обеспечивается только в том случае,
когда каретка стоит в конце текста.
А если пользователь что-то выделил, куда-то прокрутил окно,
то он спокойно смотрит-выделяет-копирует в середине текста,
а новые строчки спокойно стримятся в конец.
Здравствуйте, qaz77, Вы писали:
Q>Здравствуйте, Carc, Вы писали:
C>>Дык добавлять и в Edit можно… C>>Делов-то, йопта? C>>
C>>EM_SETSEL (-1 , -1) + EM_REPLASESEL();
C>>
C>>Это и Edit все умеет, ну и RichEdit тоже само собой.
Q>Это все известно, но порождает другие проблемы. Q>Надо запоминать, что у пользователя было выделено, потом восстанавливать. Q>Скроллинг также запоминать-восстанавливать.
Q>Плюс EM_STREAMIN в том, что ничего никуда не прокручивает. Q>Выделение и позиция скроллинга остаются какими были. Q>Если нужно куда-то прокрутить, то делаем это руками.
А зачем для этого EM_STREAMIN, я чего-то не пойму… Можно кусок кода посмотреть?
Имхо, проще использовать интерфейс ITextRange.
Здравствуйте, flаt, Вы писали:
CEM>>Если уж напрягаться, то можно тогда просто свой Edit забабахать хотелось минимально что-то своё делать.
F>Scintilla не вариант?
У меня свой такой есть, но они оба с излишним функционалом. Не хочется тащить лишнее в проект, а выкидывать и отлаживать может оказаться дольше, чем написать с нуля.
Хотелось просто стену текста с возможностью выделения и копирования. Я вообще когда с проблемой столкнулся, думал, что я чего-то тут не знаю, потому как казалось, что такое требование к контролу довольно ожидаемое, плюс у ListView32 такое есть, а он несколько сложнее.
Думаю, сделаю просто стену текста без копирования, зато быстро.
Здравствуйте, CEMb, Вы писали:
CEM>Задумка примерно такая. Вот есть консоль cmd, туда текст может сыпаться огромными количествами, просто через printf, добавляется в хвост, его там можно скроллить, копировать. CEM>Хочется такой же EDIT.
Поищи на Code Project, я там находил. У меня давно давно была задача: надо было cout перенаправить в Edit.
СЛАВА РФ! СЛАВА ПУТИНУ, моему любимому царю и вождю великому! Смотрю только Соловьева, Симонян, Скабееву, МО РФ.
Здравствуйте, Шольцевская Колбаса, Вы писали:
ШК>Поищи на Code Project, я там находил. У меня давно давно была задача: надо было cout перенаправить в Edit.
да я пока просто запилил read-only edit, без выделения/копирования, а если понадобится вдруг, буду решать задачи по мере поступления