【问题标题】:Vb6 Drag and Drop HTML dataVb6 拖放 HTML 数据
【发布时间】:2016-06-15 15:01:45
【问题描述】:

在 Visual basic 6 中,剪贴板有多种格式。要从剪贴板中检索 HTML 数据,这非常有用:https://support.microsoft.com/en-us/kb/274326

现在我的问题是,如何从拖动的数据而不是剪贴板中获取 HTML 信息?

例如, 我想要一个多行文本框,当我将内容从网页拖动到文本框时,文本框将显示从 OLE 拖动信息中检索到的 HTML,而不是 vbCFtext。

我尝试使用与上面链接中相同的技术,但不是 GetClipboardData - 使用 Data.GetData(RegisterClipboardFormat("HTML Format")) [来自 Picture1_OLEDragDrop(...] 但我得到一个溢出错误。 我已经在网上搜索了一个解决方案。有人在吗?

已编辑:以上已回答,谢谢!

添加: 非常感谢你!现在扭转这种情况的正确方法是什么?意思是,从文本框(包含 HTML)中拖动 - 并将其设置为在 HTML 模式下拖动?

当我简单地使用这个时:

Private Sub Text1_OLEStartDrag(Data As DataObject, AllowedEffects As Long) 'Data.SetData StrConv(Text1.Text, vbFromUnicode), (CF_HTML) Data.SetData Text1.Text, (CF_HTML) 结束子

我收到一个错误: “与 SetData 一起使用的非固有 OLE 拖放格式需要字节数组数据。GetData 可能返回比提供给 SetData 更多的字节(错误 675)”

发回数据的准确方法是什么? 并注意 in 可能有 Unicode 字符。 我是否必须使用内存副本和其他方法才能使其正常工作?非常感谢您的帮助!

【问题讨论】:

    标签: visual-studio vb6 clipboard ole


    【解决方案1】:

    您的问题是RegisterClipboardFormat 返回一个 Long(实际上是一个 uint),但剪贴板格式是 ushort(无符号整数)值。由于我们在 VB6 中没有这样的类型,我们的 DataObject 类型需要 Integer 值。因此,我们必须再玩几场比赛:

    Option Explicit
    
    Private Declare Function RegisterClipboardFormat Lib "user32" _
        Alias "RegisterClipboardFormatW" ( _
        ByVal lpString As Long) As Long
    
    Private CF_HTML As Integer
    
    Private Sub Form_Initialize()
        Dim Temp As Long
    
        Temp = RegisterClipboardFormat(StrPtr("HTML Format"))
        CF_HTML = CInt(Temp And &H7FFF&) Or IIf(Temp And &H8000&, &H8000, 0)
    End Sub
    
    Private Sub Text1_OLEDragDrop( _
        Data As DataObject, _
        Effect As Long, _
        Button As Integer, _
        Shift As Integer, _
        X As Single, _
        Y As Single)
    
        If Effect And vbDropEffectCopy Then
            Text1.Text = StrConv(Data.GetData(CF_HTML), vbUnicode)
        End If
    End Sub
    
    Private Sub Text1_OLEDragOver( _
        Data As DataObject, _
        Effect As Long, _
        Button As Integer, _
        Shift As Integer, _
        X As Single, _
        Y As Single, _
        State As Integer)
    
        If Data.GetFormat(CF_HTML) Then
            Effect = vbDropEffectCopy
        Else
            Effect = vbDropEffectNone
        End If
    End Sub
    

    【讨论】:

    • 请注意,为了说明,上面的代码“假设”返回的 UTF-8 数据是 ASCII。这当然不安全,您应该进行完整的重新编码,而不是只使用 StrConv(),如图所示。您还需要解析结果,因为它包含元数据以及原始 HTML 数据。见msdn.microsoft.com/en-us/library/windows/desktop/…
    • 我在问题中添加了更多内容 - 关于反向操作(已编辑)
    • 在我的评论中查看上面的链接。您必须创建一个与此格式要求相对应的有效负载,并且由于它必须是 UTF-8,因此您应该将其传递到 Byte 数组中。由于上面的示例代码是获取一个字节数组,假装它包含 ANSI 文本并将其粗略地转换为字符串,因此您必须将其反转。
    猜你喜欢
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    相关资源
    最近更新 更多