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

Posted

技术标签:

【中文标题】如何在 Visual Basic 6 中对齐 RichEdit 粘贴对象位置?【英文标题】:How to align RichEdit paste object position in Visual Basic 6? 【发布时间】:2008-12-12 10:04:33 【问题描述】:

我们有一个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框的位置?

【问题讨论】:

如何确定插入位置?我只能看到锁定代码。 【参考方案1】:

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

希望对您有所帮助。

【讨论】:

【参考方案2】:

为什么不在粘贴前检索位置?

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

【讨论】:

以上是关于如何在 Visual Basic 6 中对齐 RichEdit 粘贴对象位置?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Basic 6 中制作表单模板?

如何在 Visual Basic 6.0 中创建带有文本框的数组

如何在Visual Basic 6.0中使用主键在一个表中使用外键获取记录

如何在 Visual Basic 6 ListView 上进行多列排序?

如何在此 Access-SQL server-Visual Basic 6 (ADO) 表单中不包含重复元素(主详细信息)

我们如何在 Visual Basic 6 中导入 LibreOffice Writer 的监听器事件