2008-12-12 3 views
1

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

В принципе логика выглядит следующим образом: пользователь нажимает на вставку математического уравнения, мы позволяем им использовать внешний редактор 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?

+0

Как вы определяете позицию вставки? Я могу видеть только код блокировки. –

ответ

0

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

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

0

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

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