Как выровнять положение объекта вставки RichEdit в Visual Basic 6?

У нас есть элемент управления RichEdit, в который мы позволяет пользователю вставлять объект уравнения Office MathML.

В основном логика выглядит так: пользователь нажимает на вставку математического уравнения, мы разрешаем им использовать внешний редактор MathML, затем мы вставляем изображение для представления уравнения в элемент управления RichEdit:

' Paste the picture into the RichTextBox.
SendMessage ctlLastFocus.hwnd, WM_PASTE, 0, 0

Найдите его положение и зафиксируйте, используя:

With ctlLastFocus
    'lock the image
    .SelStart = .SelStart - 1
    .SelLength = 1
    .SelProtected = True

Все это прекрасно в прекрасном мире ANSI, но мы также разрешаем символы Unicode и что я заметил, так это то, что когда вы используете китайские символы, позиция вставки неверна на половину общей позиции, т.е. если она должна быть 7-й позицией, теперь она вставляется в третью.

Я полагаю, что в основном делится на два, потому что Unicode занимает два байта по сравнению с ANSI, для которого требуется только один. Потому что я болван без опыта работы с RTF, RichEdit и Visual Basic 6.

Итак, мой вопрос: могу ли я изменить положение изображения при его вставке с помощью строки sendMessage?

Или каким-либо другим способом контролировать положение изображения, вставленного в поле RichEdit?


person melaos    schedule 12.12.2008    source источник
comment
Как вы определяете позицию вставки? Я вижу только код блокировки.   -  person Daniel Rikowski    schedule 30.01.2009


Ответы (2)


Мой подход заключается в следующем: если вы посмотрите на rtf.SelRTFproperty, вы сможете точно увидеть, что такое код RTF, который создает визуал в RichTextBox. Затем вы можете сохранить это в файл, загрузить его словом и перемещать изображение, пока оно не окажется в нужном месте, сохраните файл и снова посмотрите код RTF. На этом этапе вы должны знать достаточно о сочетании китайского или других языков Unicode, чтобы создать код обработки строк, который будет делать то, что вы хотите. Я не совсем уверен, что каждый символ Юникода составляет 2 байта - стоит проверить, серьезно ли вы относитесь к поддержке полного диапазона.

Надеюсь, это поможет.

person MrTelly    schedule 30.01.2009

Почему бы не получить позицию перед вставкой?

Dim iStartPos As Long
Dim iLength As Long
With ctlLastFocus
    iStartPos = .SelStart
    SendMessage.hwnd, WM_PASTE, 0, 0
    iLength = .SelStart - iStartPos
    .SelStart = iStartPos
    .SelLength = iLength
    .SelProtected = True
End With
person svinto    schedule 30.01.2009