информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыВсе любят медСетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
К сожалению, это не спасает срабатывания скроллинга. 08.12.08 13:13  Число просмотров: 3101
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
> 1) Запрещаем перерисовывать окно (через WM_SETREDRAW)
К сожалению, это не спасает срабатывания скроллинга.

> >
> > Руки бы поотрывал разработчикам MFC/WinAPI.
> >
> А вот это ты - зря.
> MFC, как библиотека базовых классов - очень хорошо
> написана.
Мне откровенно говоря не с чем сравнивать - может быть в сравнении с другими фреймворками она и хороша. Но если не брать в рассчет другие фреймворки, то я на острые углыв MFC вроде этого натыкаюсь чуть ли не каждый день.
<programming>
[MFC, Win32] CRichEditCtrl - пытаюсь подсвечивать синтаксис 04.12.08 15:27  
Автор: Heller <Heller> Статус: Elderman
Отредактировано 04.12.08 16:23  Количество правок: 2
<"чистая" ссылка>
Есть задача - подсвечивать синтаксис в сорсах наподобие Сишных. Наследуюсь от CRichEditCtrl. Здесь возникает трудность - все способы смены формата текста которые я нашел завязаны на текущую селекцию/позицию. То есть прежде чем применить формат к тексту, я должен его селектировать.Однако винда сразу при смене селекии, если она не умещается в видимой области, скролирует текст так, чтобы селекция поместилась в экран. Это приводит к перемаргиванию (есть метод HideSelection, который позволяет скрыть селекцию, но это не спасает от автоматического скроллинга).

Собственно проблема имеется только с последней строчкой. Когда пользователь в середине текста открывает многострочный комментарий (/*), надо прокрасить весь текст вниз, включая последнюю видимую строчку, которая чаще всего не помещается на экран целиком. Попытка селектировать ее для смены формата приводит к скроллингу.

Выставлять позицию скроллинга в первоначальную после перекраски не представляется возможным, так как реально скроллинг позиционируется не точно по строкам, а ScrollLine принимает в качестве параметров только целые значения. Перехватывать момент скроллинга так же не получается, так как WM_VSCROLL зовется только если таскать скроллинг руками.

Хотел вообще последнюю строчку не отображать, если она целиком не умещается - переопределил для этого OnPaint, но как только я это сделал, что-либо отрисовываться вообще перестало.

Короче я в замешательстве. Собственные идеи кончились. Буду рад чужим.

P.S. Родилась идея рисовать поверх контрола просто белый прямоугольник, перекрывая последнюю строчку, но это совсем уж грязный хак.

P.S.S. Можно конечно и самому текст в OnPaint-е отрисовывать, но не хочется блин.
О, еще прикол 23.12.08 10:34  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
Если позвать setUndoLimit(0) (что вполне легально - должно отключить функцию Undo вообще, об этом написано в MSDN), то потом начинаются падения при драг'н'дропе внутри контрола. Охренеть.

Собственно на данный момент осталась только одна проблема (я на долгое время отвлекался от этой задачи, только вчера вечером опять засел): надо как-то отлавливать момент того самого драг'н'дропа для переформатирования текста, либо вообще его запретить. Spy не показывает вроде бы никаких особых сообщений, на обработку которых можно было бы повеситься. Чувствую, что решение где-то на поверхности, но в упор не вижу.
Разобрался, но с того не легче 09.12.08 13:51  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
Действительно, при нормальных обстоятельствах для корректной раскраски синтаксиса оказалось достаточным не отрисовывать селекцию (либо через запрет перерисовки, либо через HideSelection - без разницы), проблема оказалась наведенной.

Я повесился на эвент EN_CHANGED, для которого необходимо вначале выставить SetEventMask - иначе он не посылается. Так вот когда изъявляешь желание получать EN_CHANGED, CRichEditCtrl начинает автоматически скролить куда не надо. Вот такой подарочек. В документации об этом ни слова (к вопросу о Microsoft).

Собственно, на EN_CHANGED я вешался с целью корректно обрабатывать поведение контрола при вставке из буффера и драг'н'дропа. Теперь надо эти вещи обрабатывать независимо.

В общем, чувствую, что геммороев можно нажить еще очень много с этим CRichEditCtrl - все оказалось не так просто. Буду лучше прикручивать Scintill'у (хотя и ее еще надо как следует покопать). Черт.
вот натолкнулся на идею может поможет 11.12.08 09:49  
Автор: i1 Статус: Незарегистрированный пользователь
Отредактировано 11.12.08 09:51  Количество правок: 1
<"чистая" ссылка>


http://www.wasm.ru/article.php?article=1001035
не знаю твоей реализации, поэтому просто идея. может быть стоит делать подсветку не по строкам а по словам? дать отдельный поток, и подсвечивать видимые слова, а не строки. 04.12.08 22:22  
Автор: kstati <Евгений Борисов> Статус: Elderman
<"чистая" ссылка>
Сорцы достаточно сложно рассматривать в виде слов -... 05.12.08 10:31  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
Сорцы достаточно сложно рассматривать в виде слов - особенное неудовольствие вызывают комментарии типа .... В любом случае для форматирования слова так же надо выставить курсор, что так же приводит к автоматическому скроллингу.
А может все таки Scintilla? Будет тебе подсветка 04.12.08 21:23  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Но когда понадобится - появится еще и code folding и autocompletion и много всякого остального
Задача пока очень маленькая - дать пользователю возможность... 05.12.08 10:28  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
Задача пока очень маленькая - дать пользователю возможность в диалоговом окне вбивать свой индикатор (10-20 строк кода), и потребности в чем-либо серьезном пока нет.

Scintill-у смотрел уже достаточно давно, и по каким-то причинам она не устроила. То ли лицензия не та, то ли тяжело с MFC подружить. Не помню. В любом случае изначально казалось, что реализовать просто подсветку синтаксиса на первом этапе куда проще и быстрее, чем вклинить чужой крутой контрол. И в общем-то так оно и есть - целиком реализация подсветки пишется за 15-20 минут. Единственное, что вызвало затруднение - невозможность форматировать произвольный фрагмент текста с тупым скроллингом.

Руки бы поотрывал разработчикам MFC/WinAPI.
В свое время, я делал так 05.12.08 18:09  
Автор: Neznaika <Alex> Статус: Member
<"чистая" ссылка>
> Единственное, что вызвало затруднение - невозможность форматировать
> произвольный фрагмент текста с тупым скроллингом.
>
1) Запрещаем перерисовывать окно (через WM_SETREDRAW)
2) Делаем SetSelection и устанавливаем новый формат
3) Разрешаем перерисовывать окно (через WM_SETREDRAW) и обновляем (через InvalidateRect)
Понятно, что WM_SETREDRAW - делаем через try/finally.

>
> Руки бы поотрывал разработчикам MFC/WinAPI.
>
А вот это ты - зря.
MFC, как библиотека базовых классов - очень хорошо написана.
К сожалению, это не спасает срабатывания скроллинга. 08.12.08 13:13  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
> 1) Запрещаем перерисовывать окно (через WM_SETREDRAW)
К сожалению, это не спасает срабатывания скроллинга.

> >
> > Руки бы поотрывал разработчикам MFC/WinAPI.
> >
> А вот это ты - зря.
> MFC, как библиотека базовых классов - очень хорошо
> написана.
Мне откровенно говоря не с чем сравнивать - может быть в сравнении с другими фреймворками она и хороша. Но если не брать в рассчет другие фреймворки, то я на острые углыв MFC вроде этого натыкаюсь чуть ли не каждый день.
Сдается мне, что ты - не совсем правильно делаешь 08.12.08 23:00  
Автор: Neznaika <Alex> Статус: Member
<"чистая" ссылка>
Давай попробуем еще раз:

1) Запретили перерисовывать
2) Сохранили старый Selection
3) Установили новый Selection, добавили формат
4) Возвращаем Selection обратно
5) Разрешаем перерисовывать и обновляем

По смыслу, здесь вообще - никакого скроллинга нет.
Или покажи, как у тебя форматируется.
Похоже действительно что-то делаю не так 09.12.08 11:32  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
> Давай попробуем еще раз:
>
> 1) Запретили перерисовывать
> 2) Сохранили старый Selection
> 3) Установили новый Selection, добавили формат
> 4) Возвращаем Selection обратно
> 5) Разрешаем перерисовывать и обновляем
>
> По смыслу, здесь вообще - никакого скроллинга нет.
> Или покажи, как у тебя форматируется.
Сделал тестовый проект - все работает. Визуально в рабочем коде вроде все то же самое, но скролится. Очевидно, имеет место какой-то наведенный эффект. В общем, буду копать.
Эх, не пришлось бы потом все переписывать нахрен. 05.12.08 12:53  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Задача пока очень маленькая - дать пользователю возможность
> в диалоговом окне вбивать свой индикатор (10-20 строк
> кода), и потребности в чем-либо серьезном пока нет.

Эх, не пришлось бы потом все переписывать нахрен.

> Scintill-у смотрел уже достаточно давно, и по каким-то
> причинам она не устроила. То ли лицензия не та, то ли

Лицензия некопилефтная.

> тяжело с MFC подружить. Не помню. В любом случае изначально

С MFC сдруживается легко (первая ссылка в гугле: http://www.naughter.com/scintilla.html )

> Руки бы поотрывал разработчикам MFC/WinAPI.
Ноно. Я те поотрываю :-)
MFC кстати, вполне отличный фреймворк (несмотря на то, что от него принято воротить нос и несмотря на то, что он появился еще до того как в плюсах появились стандартные контейнеры, стандартные эксепшоны и стандартные RTTI). Ну а WinAPI - довольно эклектично, но зато полная backward compatibility. Тут или переписывать весь софт для каждой новой версии или поддерживать такое вот болото.
Изначально на это и был заклад. Проект большой в перспективе... 08.12.08 19:52  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
> Эх, не пришлось бы потом все переписывать нахрен.
Изначально на это и был заклад. Проект большой в перспективе - для начала хотелось сделать хоть какой редактор, который потом будет не жалко снесци и целиком заново уже прикрутить что-то новое. Стратегия почти оправдала себя - написано все было за пару часов "от и до". Только скроллинг подкачал. Ну в общем, сейчас прикручиваю Сцинтиллу - уже пол-дня потратил. Но видимо это все равно рано или поздно пришлось бы делать.

> С MFC сдруживается легко (первая ссылка в гугле:
> http://www.naughter.com/scintilla.html )
Спасибо за наводку.

> > Руки бы поотрывал разработчикам MFC/WinAPI.
> Ноно. Я те поотрываю :-)
> MFC кстати, вполне отличный фреймворк (несмотря на то, что
> от него принято воротить нос и несмотря на то, что он
> появился еще до того как в плюсах появились стандартные
> контейнеры, стандартные эксепшоны и стандартные RTTI). Ну а
> WinAPI - довольно эклектично, но зато полная backward
> compatibility. Тут или переписывать весь софт для каждой
> новой версии или поддерживать такое вот болото.
Очень понравилось такая функция в CRichEditCtrl:

int LineLength(
int nLine = -1
) const;

...
nLine
Specifies the character index of a character in the line whose length is to be retrieved. If this parameter is –1, the length of the current line (the line that contains the caret) is returned, not including the length of any selected text within the line. When LineLength is called for a single-line edit control, this parameter is ignored.
...

Ни фига себе character index. 15 минут разработки потрачено на чесание репы почему он всегда возвращает длину первой строчки, когда задаешь ему номер разных строчек. И такая MFC вся.

Ну и к слову: могли бы уж за более чем десять лет хотя бы перестать навязывать неправильные и опасные решения типа бинарного CArchive. Сколько проектов начинается регулярно по неопытности с использованием CArchive, где нужен XML? Черт бы его побрал (я сейчас как раз с этим мучаюсь).
Во первых, это не MFC, это WinAPI: 08.12.08 22:28  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Очень понравилось такая функция в CRichEditCtrl:
>
> int LineLength(
> int nLine = -1
> ) const;
>
> ...
> nLine
> Specifies the character index of a
> character in the line whose length is to be retrieved. If
> this parameter is –1, the length of the current line (the
> line that contains the caret) is returned, not including
> the length of any selected text within the line. When
> LineLength is called for a single-line edit control, this
> parameter is ignored.
> ...
>
> Ни фига себе character index. 15 минут разработки потрачено
> на чесание репы почему он всегда возвращает длину первой
> строчки, когда задаешь ему номер разных строчек. И такая
> MFC вся.

Во первых, это не MFC, это WinAPI:
int CRichEditCtrl::LineIndex(int nLine /* = -1 */) const
{
	ASSERT(::IsWindow(m_hWnd));
	return (int)::SendMessage(m_hWnd, EM_LINEINDEX, nLine, 0);
}

---

Во вторых, я так и не понял в чем проблема. Ты получаешь номер строки по номеру символа так? Дефолтом возвращается номер текущей строки. Все это задокументировано. Чего не так то?

> Ну и к слову: могли бы уж за более чем десять лет хотя бы
> перестать навязывать неправильные и опасные решения типа
> бинарного CArchive. Сколько проектов начинается регулярно
> по неопытности с использованием CArchive, где нужен XML?
> Черт бы его побрал (я сейчас как раз с этим мучаюсь).

Ну дык а взять msxml вместо архива что мешает?
Я говорил о 09.12.08 10:55  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
> Во первых, это не MFC, это WinAPI:
>
int CRichEditCtrl::LineIndex(int nLine /* = -1> */) const
> {
> 	ASSERT(::IsWindow(m_hWnd));
> 	return (int)::SendMessage(m_hWnd, EM_LINEINDEX,
> nLine, 0);
> }

---
>
> Во вторых, я так и не понял в чем проблема. Ты получаешь
> номер строки по номеру символа так? Дефолтом возвращается
> номер текущей строки. Все это задокументировано. Чего не
> так то?
Я говорил о
int LineLength(int nLine)
а не о
int LineIndex(int nLine)

Возвращать номер строки по номеру символа - это очень правильно и разумно. А вот когда тебе хочется получить длину строки n, то приходится уже писать
LineLength(LineIndex(n))
И в общем хрен бы с ним, но когда я вижу в объявлении параметр nLine, то я никак не могу предположить, что это на самом деле Character Index. Да, в документации все написано. Но ты что - каждый раз лезешь в документацию? Написал str.GetLength() и потом сверяешься, вернет ли она дейстивтельно длину строки, или, может быть, количество пробелов?

Это пример банальной неаккуратности. Если напрячь память, то таких образцов можно привести в избытке. Это просто самое последнее.

> Ну дык а взять msxml вместо архива что мешает?
Никто не мешает, но только когда уже имеешь какой-то опыт. Когда же человек открывает книгу по MFC, а ему с первых глав начинают говорить о сериализации CObject, потом рассказывают о замечательном и удобном CArchive, а потом еще и визард дружелюбно генерит все необходимое для использования скверны, то даже человек знакомый с XML может на некоторое время уверовать в CArchive и лепить сериализацию через него. А потом будет хвататься за голову с поддержкой версий и эксепшинами, возникающими то там то тут (совершенно не поддающимися отладке в случае с CArchive).
О точно. Но это все равно WinAPI, а не MFC 09.12.08 22:10  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Я говорил о
> int LineLength(int nLine)
> а не о
> int LineIndex(int nLine)
О точно. Но это все равно WinAPI, а не MFC

> > Ну дык а взять msxml вместо архива что мешает?
> Никто не мешает, но только когда уже имеешь какой-то опыт.
Я кстати ни разу с CArchive-ами не работал, а с msxml-ем - работал :-)
Хотя сериализация в плюсах (неважно с каким бэкэндом) - тот еще геморрой. Рефлекшна нет - приходится вручную писать в каждом классе гору вспомогательного кода.

Вывод - нефиг читать всякие "MFC for dummies", нужны только примеры чужого кода и документация.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 1 s   Design: Vadim Derkach