Как получить регион для выделенного текста?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Как получить регион для выделенного текста?

Сообщение Ruslan Demidow » 30.07.2004 (Пт) 11:04

Вопрос такой возник: нужно получить регион для выделенного текста в RichEditBox. А как - не знаю.
Подскажите, плиз...

natcap
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 234
Зарегистрирован: 25.06.2003 (Ср) 13:15
Откуда: Москва

Сообщение natcap » 30.07.2004 (Пт) 11:11

А что такое регион? с какого по какой символ выделено???
Если да, то .SelStart - начало выделения, .SelLength - длина выделения
Медленно переезжаю с 6.0 на 2008 .... задавая тонны глупых вопросов :)

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 30.07.2004 (Пт) 11:33

natcap писал(а):А что такое регион? с какого по какой символ выделено???
Если да, то .SelStart - начало выделения, .SelLength - длина выделения

Про .SelStart и SelLength я знаю.
Мне нужно получить графические координаты прямоугольника, в котором находится выделенный текст. После этого я смогу инвертировать тект через InverseRGN (или как-то так).

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.07.2004 (Пт) 17:22

Вот ведь маньяк...
Это тебе придётся искать верхнюю границу области текста (она в общем случае не совпадает с границей контрола), от неё считать вниз... Точно так же от левой границы... А выделение может быть непрямоугольным... Утонешь :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 31.07.2004 (Сб) 1:01

GSerg писал(а):Вот ведь маньяк...
Это тебе придётся искать верхнюю границу области текста (она в общем случае не совпадает с границей контрола), от неё считать вниз... Точно так же от левой границы... А выделение может быть непрямоугольным... Утонешь :)

Ну ещё бы. :) Простых путей не ищем. :)
Вообще то я думал так. Возможно существует функция или набор функций с помощью которых можно получить координаты выделенного текста. После этого инвертировать его.
Это всё из-за моего незнания управляющих кодов RichEditBox'а. :)
Но я уже сделал. Мне всего-то хотелось инвертировать текст в риче.
Хотя от примера технологии получения региона выделенного текста я бы не отказался. :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 31.07.2004 (Сб) 11:01

Это всё из-за моего незнания управляющих кодов RichEditBox'а

Они все начинаются с EM_. Нужного там нет, я смотрел :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 31.07.2004 (Сб) 23:58

EM_ - я знаю. Но пришлось по другому. Мне подсказали, что можно вставить в .TextRTF управляющее слово (не сообщение отправить, а вставить слово) "\highlight" и текст будет инвертирован.
Я сделал, работает...
Выглядит это так (пример: Фраза "Мама мыла раму", нужно сделать слово мыла инверсным)
Код: Выделить всё
Option Explicit

Private Sub Form_DblClick()
With RichTextBox1
.Text = "Мама мыла раму"
.SelStart = 5: .SelLength = 4
.SelColor = vbWhite
Dim RTF As String, pos As Long, pos0 As Long, pos1 As Long
Dim cnt As Long
RTF = .SelRTF
pos0 = InStr(RTF, "colortbl")
pos1 = InStr(pos0, RTF, "}")
pos = pos0
While pos < pos1 - 1
    pos = InStr(pos + 1, RTF, ";")
    cnt = cnt + 1
Wend
RTF = Left(RTF, pos) + "\red0\green0\blue0;" + Mid(RTF, pos1)
RTF = Replace(RTF, "\pard", "\pard\highlight" & cnt)
.SelRTF = RTF
End With
End Sub

Так что в принципе тред можно считать закрытым.
Но всё-таки от показательного примера по получению координат прямоугольника содержащего выделенный текст я бы не отказался. :roll:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.08.2004 (Вс) 17:08

Хоть бы копирайты расставлял... Да ладно - я не жадный ;-)

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 02.08.2004 (Пн) 9:04

tyomitch писал(а):Хоть бы копирайты расставлял... Да ладно - я не жадный ;-)

Извини, но это мне подсказали из ФИДО. Копирайтов там тоже не было.
Тем более я указал что код придуман не мной, мне подсказали ка это делать. Но если ты так хочешь, то могу уточнить... :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 02.08.2004 (Пн) 16:38

Ruslan Demidow писал(а):
tyomitch писал(а):Хоть бы копирайты расставлял... Да ладно - я не жадный ;-)

Извини, но это мне подсказали из ФИДО. Копирайтов там тоже не было.
Тем более я указал что код придуман не мной, мне подсказали ка это делать. Но если ты так хочешь, то могу уточнить... :)

Там это тебе подсказал я, копирайты были в поле From: ;-)
Случайно захожу на этот форум, а тут - ба, знакомые все лица! :-D

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 03.08.2004 (Вт) 9:06

tyomitch писал(а):
Ruslan Demidow писал(а):
tyomitch писал(а):Хоть бы копирайты расставлял... Да ладно - я не жадный ;-)

Извини, но это мне подсказали из ФИДО. Копирайтов там тоже не было.
Тем более я указал что код придуман не мной, мне подсказали ка это делать. Но если ты так хочешь, то могу уточнить... :)

Там это тебе подсказал я, копирайты были в поле From: ;-)
Случайно захожу на этот форум, а тут - ба, знакомые все лица! :-D

Ну извини tyomitch. :) Не признал. :)
Сейчас проставлю копирайты:
A. Skrobov (2:5080/1003.16) г. Екатеринбург.
Так?
Или
Martynov Sergey?

AOT: И всё-таки, кто-нибудь подскажет мне как получить регион выделенного текста в RTB?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 03.08.2004 (Вт) 10:18

Ruslan Demidow писал(а):
tyomitch писал(а):
Ruslan Demidow писал(а):
tyomitch писал(а):Хоть бы копирайты расставлял... Да ладно - я не жадный ;-)

Извини, но это мне подсказали из ФИДО. Копирайтов там тоже не было.
Тем более я указал что код придуман не мной, мне подсказали ка это делать. Но если ты так хочешь, то могу уточнить... :)

Там это тебе подсказал я, копирайты были в поле From: ;-)
Случайно захожу на этот форум, а тут - ба, знакомые все лица! :-D

Ну извини tyomitch. :) Не признал. :)
Сейчас проставлю копирайты:
A. Skrobov (2:5080/1003.16) г. Екатеринбург.
Так?
Или
Martynov Sergey?

Всё, большое спасибо, справедливость восстановлена ;-)

Ruslan Demidow писал(а):AOT: И всё-таки, кто-нибудь подскажет мне как получить регион выделенного текста в RTB?

Есть идея - получить от ричедита ITextDocument (EM_GETOLEINTERFACE), потом ITextRange выделения (ITextDocument::GetSelection), и наконец ITextRange::GetPoint. Правда, при этом придётся "предполагать", что регион прямоугольный, но имхо для слова - ведь тебе одно слово надо выделить? - это разумно.

Но всё-таки имхо это бред с получением региона. При каждом скролле и каждом изменении текста его придётся обновлять.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 03.08.2004 (Вт) 10:38

Ясно, спасибо за совет. Но посмотрев сколько нужно сделать телодвижений для получения региона и что нужно его каждый раз перерисовывать я пожалуй соглашусь с тобой - не стоит овчинка выделки.
Думаю на этом тред можно считать закрытым.
Всем До встречи.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 03.08.2004 (Вт) 13:39

Кроме всего прочего, предложенный мной метод не работает, поскольку RichTextBox - это RichTextWndClass, а не RichEdit20A, и оно не понимает EM_GETOLEINTERFACE ;-(

Настоятельно рекомендую посмотреть RichTextBox от Eduardo A. Morcillo: от него есть исходники (т.е. не надо таскать с собой OCX), и у него много дополнительных возможностей по сравнению со стандартным, например цвет выделения (т.е. именно то, что тебе надо) можно указать программно.

http://www.mvps.org/emorcillo/vb6/contr ... riched.msi

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 03.08.2004 (Вт) 14:32

tyomitch писал(а):Кроме всего прочего, предложенный мной метод не работает, поскольку RichTextBox - это RichTextWndClass, а не RichEdit20A, и оно не понимает EM_GETOLEINTERFACE ;-(

Настоятельно рекомендую посмотреть RichTextBox от Eduardo A. Morcillo: от него есть исходники (т.е. не надо таскать с собой OCX), и у него много дополнительных возможностей по сравнению со стандартным, например цвет выделения (т.е. именно то, что тебе надо) можно указать программно.

http://www.mvps.org/emorcillo/vb6/contr ... riched.msi

Ага, спасибо. Но я вот посмотрел - там 300 кило. Это, скажем, существенная прибавка к весу моей программы. :(
Или в эти 300 упакованы и исходники и сам контрол?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 03.08.2004 (Вт) 15:51

Ruslan Demidow писал(а):
tyomitch писал(а):Настоятельно рекомендую посмотреть RichTextBox от Eduardo A. Morcillo: от него есть исходники (т.е. не надо таскать с собой OCX), и у него много дополнительных возможностей по сравнению со стандартным, например цвет выделения (т.е. именно то, что тебе надо) можно указать программно.

http://www.mvps.org/emorcillo/vb6/contr ... riched.msi

Ага, спасибо. Но я вот посмотрел - там 300 кило. Это, скажем, существенная прибавка к весу моей программы. :(
Или в эти 300 упакованы и исходники и сам контрол?

Там зачем-то MSI-шная инсталляха, понятия не имею зачем. Простой ZIP со всем, что там лежит, занимает 200 Кб.
Действительно, там и исходники, и контрол, и тестовый проект, и тестовый RTF с внедрёнными объектами, и скомпилированный тестовый проект... В общем, всё что можно :-)

Скомпилированный контрол занимает 250 Кб, но опять же, ты можешь добавить его исходники прямо к себе в проект.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 04.08.2004 (Ср) 10:14

Ага. Понятно. Спасибо, я скачал. Попробую его.
Ещё раз спасибо. :)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 96

    TopList