Выделение слов в RichTextBox

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Выделение слов в RichTextBox

Сообщение Don Leno » 21.01.2017 (Сб) 5:44

Написал небольшой проект в котором слова должны выделятся. Проблема в том, что выделение слов происходит неправильно. Не могу найти ошибку!
Ниже опишу, как все происходит:
Используется РичТекстБокс, на котором перерисовывается фоновое изображение и накладывается рисунок позади выделяемых слов (процедура Selector), все происходит в цикле Do...Loop в Sub_Main.
Длина слов извлекается из объекта Label (Visible=False, Autosize=True)
Но вот проблема рисунок выделения слова накладывается неправильно(см скрин ниже)
Вложения
Seler.jpg
Пример того как происходит выделение слов
Seler.jpg (17.49 Кб) Просмотров: 3744
modRTB Selector.rar
(6.15 Кб) Скачиваний: 202

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Выделение слов в RichTextBox

Сообщение Mikle » 21.01.2017 (Сб) 21:26

Don Leno писал(а):Длина слов извлекается из объекта Label (Visible=False, Autosize=True)

Для этого у формы есть функция TextWidth().
Проблема, похоже, в том, что размер текста не всегда равен сумме размеров его фрагментов при использовании не моноширинного шрифта, я заменил Font на Courier New - и всё заработало корректно.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Выделение слов в RichTextBox

Сообщение Don Leno » 22.01.2017 (Вс) 22:30

Mikle, так хотелось бы сделать чтобы работало с разными шрифтами. За TextWidth спасибо не знал.
P.S.
Мне иногда кажется легче написать свое текстовое поле для своих нужд(((

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Выделение слов в RichTextBox

Сообщение Don Leno » 22.01.2017 (Вс) 23:10

При нажатии пробела появляется артефакт - в пробеле подкрашивается нижняя его часть зеленым цветом выделения? Не могу понять почему?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Выделение слов в RichTextBox

Сообщение Mikle » 23.01.2017 (Пн) 10:01

Don Leno писал(а):хотелось бы сделать чтобы работало с разными шрифтами

Проверяй длину строки всегда от начала до нужного слова, а не длину слов по отдельности.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Выделение слов в RichTextBox

Сообщение alibek » 23.01.2017 (Пн) 11:47

А еще советую выбрать в качестве шрифта, например, Times New Roman, 14pt, Italic.
Будет много сюрпризов.
Lasciate ogni speranza, voi ch'entrate.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Выделение слов в RichTextBox

Сообщение Don Leno » 23.01.2017 (Пн) 16:04

alibek, :D я обязательно попробую)))
Mikle, спс за совет буду пробовать)))

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Выделение слов в RichTextBox

Сообщение Don Leno » 25.01.2017 (Ср) 17:50

Столкнулся с еще одной проблемой, мне теперь нужно скопировать все содержимое РичТекстБокса (имеется ввиду графику) без зеленого цвета выделения в контекст. Пробую через TransparentBlt - ничего не получается. Просьба помочь с этим вопросом.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Выделение слов в RichTextBox

Сообщение The trick » 30.01.2017 (Пн) 23:35

Don Leno писал(а):Написал небольшой проект в котором слова должны выделятся. Проблема в том, что выделение слов происходит неправильно. Не могу найти ошибку!
Ниже опишу, как все происходит:
Используется РичТекстБокс, на котором перерисовывается фоновое изображение и накладывается рисунок позади выделяемых слов (процедура Selector), все происходит в цикле Do...Loop в Sub_Main.
Длина слов извлекается из объекта Label (Visible=False, Autosize=True)
Но вот проблема рисунок выделения слова накладывается неправильно(см скрин ниже)

Не понял что требуется, но предложу почему бы не выделять слова используя EM_SETCHARFORMAT?
Код: Выделить всё
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private Const EM_SETCHARFORMAT = (&H400 + 68)
Private Const EM_SETSEL = &HB1

Private Const LF_FACESIZE = 32
Private Const CFM_COLOR = &H40000000
Private Const CFM_BACKCOLOR = &H4000000

Private Type CHARFORMAT2
    cbSize As Integer
    wPad1 As Integer
    dwMask As Long
    dwEffects As Long
    yHeight As Long
    yOffset As Long
    crTextColor As Long
    bCharSet As Byte
    bPitchAndFamily As Byte
    szFaceName(0 To LF_FACESIZE - 1) As Byte
    wPad2 As Integer
   
    wWeight As Integer
    sSpacing As Integer
    crBackColor As Long
    lLCID As Long '
    dwReserved As Long
    sStyle As Integer
    wKerning As Integer
    bUnderlineType As Byte
    bAnimation As Byte
    bRevAuthor As Byte
    bReserved1 As Byte
End Type

Private Sub SetColor(cStart As Integer, cEnd As Integer, Color As Long, Optional BackColor As Long = vbWhite)
    Dim CF2 As CHARFORMAT2
   
    CF2.dwMask = CFM_COLOR Or CFM_BACKCOLOR
    CF2.crTextColor = Color
    CF2.crBackColor = BackColor
    CF2.cbSize = Len(CF2)
   
    SendMessage rtbText.hwnd, EM_SETSEL, cStart, cEnd
    SendMessage rtbText.hwnd, EM_SETCHARFORMAT, 1, VarPtr(CF2)
    SendMessage rtbText.hwnd, EM_SETSEL, cStart, cStart
End Sub
Private Sub Form_Load()
    rtbText.Text = "Допустим, у меня есть строковая переменная, которая содержит текст,как можно выделить красным цветом содержание этой переменной?"

    SetColor 22, 42, vbGreen, vbBlue
    SetColor 61, 66, vbYellow, vbMagenta
    SetColor 86, 93, vbRed
End Sub

preview.png
preview.png (7.65 Кб) Просмотров: 3624
Вложения
ColorText.rar
(2 Кб) Скачиваний: 199
UA6527P

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Выделение слов в RichTextBox

Сообщение Don Leno » 31.01.2017 (Вт) 22:41

Trick, ты как всегда прав)))
Просто я для примера выложил в определенном цвете, на самом деле собираюсь реализовывать выделение небольшими рисунками (текстурками), аля Ejay программы))) Но за пример спс, в будущем пригодится!!!
Вложения
DanceEjay.jpg
DanceEjay.jpg (16.94 Кб) Просмотров: 3602


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

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

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

    TopList