Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > RichTextBox. Автовысота и редактирование текста.


Автор: jcage 10.2.2009, 21:04
Нужно с RichTextBox сделать следующее:
1. Сделать нередактируемый текст
2. Сделать что бы курсор мыши не отображался
3. Сделать так, что RichTextBox изменял свою высоту в зависимости от содержимого. Т.е. что бы VScrollBars никогда не появлялись.
4. Сделать так что бы при скроллинге скролился не сам box, а его parent.

Все это корректно работает, если Enabled = false; но тогда элемент становиться серым, а мне нужен элемент нормального цвета, но отвечающий требованиям выше.

P.S. когда Enabled = false изменение цвета фона и цвета шрифта элемента ни к чему не приводят.

Автор: Лен 12.2.2009, 10:31
1) ReadOnly = true;
2) текст и так после (1) нередактируемый, но можно ещё и Cursor.Hide(); для надёжности вызвать
3) ScrollBars = None; + обработчик TextChanged для установки размера
4) обработчики на HScroll / VScroll.
Enabled оставь true, хватит и изменения ReadOnly.

Автор: jcage 12.2.2009, 10:40
Спасибо за ответ.

Есть ньансы.

1) ReadOnly = true; 
- после этого текст можно выделять.

2) текст и так после (1) нередактируемый, но можно ещё и Cursor.Hide(); для надёжности вызвать
Полностью пропадает сам курсор мыши. А я хочу, что бы курсор был обычной стрелкой, а "|" в поле RichTextBox не отображалась.

3) ScrollBars = None; + обработчик TextChanged для установки размера
Тут тоже проблема. С TextChanged понятно, но как получить высоту текста RTF не понятно - текст может быть разных шрифтов, содержать картинки, списки, быть жирным и т.д.

4) обработчики на HScroll / VScroll.
А поподробнее можно? Как передать родителю, что произошел scroll и его надо обработать?

Enabled оставь true, хватит и изменения ReadOnly.

Автор: Лен 13.2.2009, 15:10
1) Придётся на SelectionChanged вешать обработчик типа
Код

if (textBox.SelectionLength != 0)
  SelectionLength = 0;
 По-моему так можно будет "наводить выделение", но при отпусканиии кнопки мыши ничего не выделится. 
А можно и совсем уж извращенским методом пойти: положи поверх RichTextBox-а какой-нить контрол, и поставь ему прозрачность 100%.

2) Если так, то тебе просто нужно в дизайнере сделать Cursor = Default (вместо стандартного IBeam).

3) Высоту текста ручками придётся высчитывать, посмотри методы для определения габаритов текста в System.Drawing. Подробно не скажу - в C# я такие не юзал, в Делфях помнится были Canvas.TextWidth() и Canvas.TextHeight(). 

4) Напиши обработчики  событий HScroll / VScroll RichTextBox-а, а что в них писать - зависит от parent-контрола, на котором лежит  RichTextBox.

Автор: jcage 13.2.2009, 15:24
[qoute]
1) Придётся на SelectionChanged вешать обработчик типа
Код

if (textBox.SelectionLength != 0)
  SelectionLength = 0;
 По-моему так можно будет "наводить выделение", но при отпусканиии кнопки мыши ничего не выделится. 
А можно и совсем уж извращенским методом пойти: положи поверх RichTextBox-а какой-нить контрол, и поставь ему прозрачность 100%.
[/qoute]

Ну неужели нельзя сделать так что бы этот контрол впринципе не редактировался? Т.е. вел себя так же как Enabled=false, только с нормальными цветами?

3) Высоту текста ручками придётся высчитывать, посмотри методы для определения габаритов текста в System.Drawing. Подробно не скажу - в C# я такие не юзал, в Делфях помнится были Canvas.TextWidth() и Canvas.TextHeight(). 

Для RTF ничего не нашел. Для текста есть. ((

4) Напиши обработчики  событий HScroll / VScroll RichTextBox-а, а что в них писать - зависит от parent-контрола, на котором лежит  RichTextBox.

На форме лежит мой контрол. Не могу найти метод, который scroll вызовет(

Автор: Лен 16.2.2009, 10:36
1) По ходу нельзя. 
3) Так и считай для текста. =) Можешь "на глаз" выводить - навряд ли тебе нужны строгие аццкие формулы для абсолютно точного вывода RTF.
4) Беглым взглядом не видно... А если попробовать Win32API-шным SendMessage()?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)