![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| TNT86 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 14.8.2006 Где: Одесса Репутация: нет Всего: нет |
Текстовый редактор пишется с можно сказать с нуля на WinAPI. Как сделать быструю перерисовку при вставке нового текста в начало?
--------------------
виртуальныe MYSQL и PHP эксперты |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 13 Всего: 98 |
лехко: очищаеш экран и рисуеш заново.
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| TNT86 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 14.8.2006 Где: Одесса Репутация: нет Всего: нет |
--------------------
виртуальныe MYSQL и PHP эксперты |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 13 Всего: 98 |
дык: быстро узнаеш длину каждого слова строки, и быстро решаеш после какого слова выполнять перенос (для длинных строк операцию быстро повторить несколько раз) и потом быстро построчно рисуеш строки.
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| TNT86 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 14.8.2006 Где: Одесса Репутация: нет Всего: нет |
Быстро узнавать длину слова это через GetTextExtentPoint32 ?
--------------------
виртуальныe MYSQL и PHP эксперты |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 13 Всего: 98 |
ну да...
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| TNT86 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 14.8.2006 Где: Одесса Репутация: нет Всего: нет |
Кроме того, чтобы быстро рисовать построчно нужно к моменту начала прорисовки иметь готовые строки (то есть одна строка в ряд), а после вставки прийдется перераспределять строки по рядкам, что вообще говоря не быстро, потому что потребует кучу проверок и append 'ov. Только после этого начнется прорисовка нужного куска (при этом пройдет куча времени!).
--------------------
виртуальныe MYSQL и PHP эксперты |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 13 Всего: 98 |
придется перераспределять. только что тут такого?..
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Действительно - с чего ты взял, что это долго? Комп железный, он быстро считает...
Какая куча проверок и аппендов? Перераспределить нужно текущую страницу (много ли там текста? ну 50 строк...). Предыдущие никак не меняются, а последующие просто пометь как невалидные, чтобы пересчитать когда надо будет. Если текст действительно ОЧЕНЬ БОЛЬШОЙ, хранить его "куском" не стоит - нужно подумать над структурой. Скажем, как список параграфов, для каждого параграфа его текущий размер ... Тогда при вставке в параграф нужно всего-то пересчитать его, а остальные сдвинуть... -------------------- ... |
|||
|
||||
| TNT86 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 14.8.2006 Где: Одесса Репутация: нет Всего: нет |
Где-то так и делаю - есть параграфы и есть отдельно разбиение по рядкам. Просто тут не совсем комп, а смартфон и скажем определение ширины текста в строке при прорисовке с помощью GetTextExtentPoint32 очень сильно замедляет вывод (это очень заметно при скролинге).
--------------------
виртуальныe MYSQL и PHP эксперты |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 13 Всего: 98 |
а ты уверен что работу замедляет именно GetTextExtentPoint32 а не (например) неудачная стратегия определения страниц, требующих перерисовки?
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Я могу поверить, что GetTextExtentPoint32 замедляет работу - все GDI вызовы очень тормозные, особенно если ты направо-налево ее вызываешь. Тебе нужно ограничить число таких вызовов. Да хоть посчитай заранее и запомни длину каждого слова.
А быстрый скроллинг и не реализуешь, если каждый раз будешь тотально перерисовывать экран. Скроллинг реализуется вызовом ScrollDC и дорисовкой новых кусков. -------------------- ... |
|||
|
||||
| TNT86 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 14.8.2006 Где: Одесса Репутация: нет Всего: нет |
Я перерисовываю только видимую область. ScrollDC мне вроде как не подходит, потому что есть фоновый рисунок. При копировании области будет копироваться и фоновый рисунок !
--------------------
виртуальныe MYSQL и PHP эксперты |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
С фоновым рисунком можно поступить так:
1) заводим отдельный мемори-контекст, куда один раз копируем фоновый рисунок. 2) текст прорисовываем не сразу на экран, а в другой мемори контекст 3) обновление экрана при перерисовке = копируем контекст с фоновым рисунком, затем копируем контекст с текстом 4) скроллинг == ScrollDC контекста с текстом, затем полное обновление Тормозов не будет, т.к. BitBlt между совместимыми контекстами выполняется очень быстро. Только позаботься о том, чтобы прибить стирание (EraseBkgnd) И еще полезно написать OnPaint примерно так:
После скролла, и других изменяющих контент операций ставишь m_bContentValid в false и делаешь Invalidate. А перерисовка экрана без обновления контента происходит пулей - только 2 операции BitBlt. -------------------- ... |
|||
|
||||
| TNT86 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 14.8.2006 Где: Одесса Репутация: нет Всего: нет |
Спасибо Earnest!!! Я почему-то был уверен, что нельзя рисовать текст с прозрачным фоном.
--------------------
виртуальныe MYSQL и PHP эксперты |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |