如何在Visual Basic 6中对齐RichEdit粘贴对象位置?

时间:2008-12-12 10:04:34

标签: vb6 sendmessage richedit

我们有一个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个位置,现在它被插入第三个位置。

基本上除以2,我想因为与ANSI相比,Unicode需要两个字节,只需要一个。因为我是一个没有RTF,RichEdit和Visual Basic 6经验的假人。

所以我的问题是:当我使用sendMessage行粘贴图像时,我可以更改图像的位置吗?

或者通过其他方式来控制插入RichEdit框中的图像的位置?

2 个答案:

答案 0 :(得分:0)

我的方法就是这样,如果你看一下rtf.SelRTF属性,你将能够准确地看到在RichTextBox中创建视觉效果的RTF代码。然后,您可以将其保存到文件中,将其加载到文字中并移动图像直到它位于正确的位置,保存文件并再次查看RTF代码。此时,您应该充分了解中文或其他Unicode语言的组合,以构建字符串操作代码以执行您想要的操作。我并不完全确定每个unicode字符都是2个字节 - 如果你认真支持全范围,那么值得一试。

希望有所帮助。

答案 1 :(得分: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