Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Текстовый редактор на WinAPI, проблемы с insertom 
:(
    Опции темы
TNT86
Дата 16.3.2007, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 14.8.2006
Где: Одесса

Репутация: нет
Всего: нет



Текстовый редактор пишется с можно сказать с нуля на WinAPI. Как сделать быструю перерисовку при вставке нового текста в начало?
--------------------
виртуальныe MYSQL и  PHP эксперты
PM MAIL WWW   Вверх
_hunter
Дата 16.3.2007, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



лехко: очищаеш экран и рисуеш заново.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
TNT86
Дата 19.3.2007, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 14.8.2006
Где: Одесса

Репутация: нет
Всего: нет



smile Подразумевалось, что после вставки мы должны быстро узнать что нам рисовать (какие слова в каких строках стоят(автоматического переноса же здесь нет)  )
--------------------
виртуальныe MYSQL и  PHP эксперты
PM MAIL WWW   Вверх
_hunter
Дата 19.3.2007, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



дык: быстро узнаеш длину каждого слова строки, и быстро решаеш после какого слова выполнять перенос (для длинных строк операцию быстро повторить несколько раз) и потом быстро построчно рисуеш строки.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
TNT86
Дата 21.3.2007, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 14.8.2006
Где: Одесса

Репутация: нет
Всего: нет



Быстро узнавать длину слова это через GetTextExtentPoint32 ?
--------------------
виртуальныe MYSQL и  PHP эксперты
PM MAIL WWW   Вверх
_hunter
Дата 21.3.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



ну да...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
TNT86
Дата 21.3.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 14.8.2006
Где: Одесса

Репутация: нет
Всего: нет



Кроме того, чтобы быстро рисовать построчно нужно к моменту начала прорисовки иметь готовые строки (то есть одна строка в ряд), а после вставки прийдется перераспределять строки по рядкам, что вообще говоря не быстро, потому что потребует кучу проверок и append 'ov. Только после этого начнется прорисовка нужного куска (при этом пройдет куча времени!).
--------------------
виртуальныe MYSQL и  PHP эксперты
PM MAIL WWW   Вверх
_hunter
Дата 21.3.2007, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



придется перераспределять. только что тут такого?..


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Earnest
Дата 21.3.2007, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Действительно - с чего ты взял, что это долго? Комп железный, он быстро считает... 
Какая куча проверок и аппендов?
Перераспределить нужно текущую страницу (много ли там текста? ну 50 строк...). Предыдущие никак не меняются, а последующие просто пометь как невалидные, чтобы пересчитать когда надо будет. Если текст действительно ОЧЕНЬ БОЛЬШОЙ, хранить его "куском" не стоит - нужно подумать над структурой. Скажем, как список параграфов, для каждого параграфа его текущий размер ... Тогда при вставке в параграф нужно всего-то пересчитать его, а остальные сдвинуть...


--------------------
...
PM   Вверх
TNT86
Дата 22.3.2007, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 14.8.2006
Где: Одесса

Репутация: нет
Всего: нет



Где-то так и делаю - есть параграфы и есть отдельно разбиение по рядкам. Просто тут не совсем комп, а смартфон и скажем определение ширины текста в строке при прорисовке с помощью GetTextExtentPoint32 очень сильно замедляет вывод (это очень заметно при скролинге).
--------------------
виртуальныe MYSQL и  PHP эксперты
PM MAIL WWW   Вверх
_hunter
Дата 22.3.2007, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



а ты уверен что работу замедляет именно GetTextExtentPoint32 а не (например) неудачная стратегия определения страниц, требующих перерисовки?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Earnest
Дата 23.3.2007, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Я могу поверить, что GetTextExtentPoint32  замедляет работу - все GDI вызовы очень тормозные, особенно если ты направо-налево ее вызываешь. Тебе нужно ограничить число таких вызовов. Да хоть посчитай заранее и запомни длину каждого слова. 
А быстрый скроллинг и не реализуешь, если каждый раз будешь тотально перерисовывать экран. Скроллинг реализуется вызовом ScrollDC и дорисовкой новых кусков.


--------------------
...
PM   Вверх
TNT86
Дата 23.3.2007, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 14.8.2006
Где: Одесса

Репутация: нет
Всего: нет



Я перерисовываю только видимую область. ScrollDC мне вроде как не подходит, потому что есть фоновый рисунок. При копировании области будет копироваться и фоновый рисунок !
--------------------
виртуальныe MYSQL и  PHP эксперты
PM MAIL WWW   Вверх
Earnest
Дата 23.3.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



С фоновым рисунком можно поступить так:
1) заводим отдельный мемори-контекст, куда один раз копируем фоновый рисунок.
2) текст прорисовываем не сразу на экран, а в другой мемори контекст
3) обновление экрана при перерисовке = копируем контекст с фоновым рисунком, затем копируем контекст с текстом
4) скроллинг == ScrollDC контекста с текстом, затем полное обновление
Тормозов не будет, т.к. BitBlt между совместимыми контекстами выполняется очень быстро. Только позаботься о том, чтобы прибить стирание (EraseBkgnd) 
И еще полезно написать OnPaint примерно так:
Код

   if (!m_bContentValid)
      UpdateContent();
   BitBlt (hPaintDC, <фоновый рисунок> ...)
   BitBlt (hPaintDC, <текст> ...)

После скролла, и других изменяющих контент операций ставишь m_bContentValid в false и делаешь Invalidate. А перерисовка экрана без обновления контента происходит пулей - только 2 операции BitBlt.




--------------------
...
PM   Вверх
TNT86
Дата 26.3.2007, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 14.8.2006
Где: Одесса

Репутация: нет
Всего: нет



Спасибо Earnest!!! Я почему-то был уверен, что нельзя рисовать текст с прозрачным фоном.
--------------------
виртуальныe MYSQL и  PHP эксперты
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1927 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.