2016-06-15 3 views
1

В Visual Basic 6 буфер обмена имеет различные форматы. Чтобы получить данные HTML из буфера обмена, это отлично работает: https://support.microsoft.com/en-us/kb/274326Vb6 Перетаскивание данных HTML

Теперь мой вопрос: как я могу получить информацию HTML из перетаскиваемых данных, а не буфера обмена?

например, Я хотел бы иметь многострочное текстовое поле, которое при перетаскивании содержимого с веб-страницы - в текстовое поле - текстовое поле будет отображать HTML, извлеченный из информации перетаскивания OLE, а не как vbCFtext ,

I'v пытались использовать ту же технику, что и в ссылке выше, но вместо GetClipboardData - использовать Data.GetData (RegisterClipboardFormat («HTML формат»)) [который приходит от Picture1_OLEDragDrop (...] , но я получаю ошибка над потоком Я искал по всей сети для решения кто-нибудь там

Отредактировано:..? выше был дан ответ, спасибо

Добавление:! большое спасибо Что бы теперь вернемся к тому, чтобы перевернуть это значение, то есть перетащить из текстового поля (содержащего HTML) - и установить его для перетаскивания в режиме HTML?

, когда я просто использую это:

Private Sub Text1_OLEStartDrag (Data Как DataObject, AllowedEffects As Long) «Data.SetData StrConv (Text1.Text, vbFromUnicode), (CF_HTML) Data.SetData Text1.Text (CF_HTML) End Sub

Я получаю сообщение об ошибке: "Non-сущностных OLE перетаскивание форматов, используемых с SetData требуют данных массива байт GetData может возвращать больше байт, чем были даны SetData (Error 675)"

Что будет b e точный способ отправки данных? и обратите внимание, что в нем могут быть символы Юникода. Должен ли я использовать копию памяти и другие, чтобы заставить это работать? Я очень ценю вашу помощь!

ответ

1

Ваша проблема в том, что RegisterClipboardFormat возвращает длинный (на самом деле uint), но форматы буфера обмена - это значения ushort (unsigned integer). Поскольку в 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 
+0

Обратите внимание, что для иллюстрации приведенный выше код «предполагает», что возвращаемые данные UTF-8 являются ASCII. Конечно, это небезопасно, и вы должны сделать полное перекодирование вместо того, чтобы просто использовать StrConv(), как показано. Вам также нужно проанализировать результат, поскольку он содержит метаданные, а также необработанные данные HTML. См. Https://msdn.microsoft.com/en-us/library/windows/desktop/ms649015(v=vs.85).aspx – Bob77

+0

Большое вам спасибо, это работает отлично! –

+0

Я добавил еще к вопросу - об обратном действии (отредактировано) –

Смежные вопросы