Vb6拖放HTML数据

时间:2016-06-15 15:01:46

标签: visual-studio vb6 clipboard ole

在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拖放格式需要Byte数组数据.GetData可能返回比给定SetData更多的字节(错误675)”

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

1 个答案:

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