Visual Basic中如何处理HTML文档和剪贴板

出处:www.examlink.com 作者:小罗 日期:2007年01月24日 14时38分
我的程序需要将HTML文档放进剪贴板中,但我不知道要怎样处理才能使其他程序也能使用它。我查看了一些关于HTML Clipboard Format (CF_HTML)的参考说明,但我还是找不到准确的定义。请问我该如何操作?

  解答:

  使用带有Windows 剪贴板的CF_HTML Clipboard Format的确容易让人搞胡涂,一部分是因为它不是clipboard format中自带的剪贴板;它是一个注册格式(registered format),所以不是一个常量,因为它的值会因为系统的不同而产生变化。你可以通过一个简单的API调用 -- RegisterClipboardFormat来获得一个注册剪贴板格式的值。这个函数的首次调用会通过一个给定的字符串来执行,它返回一个范围在C000-FFFF之间的唯一值。每一个在系统上处理的后续调用(subsequent call)会返回同样的值。用于这种格式中的关键字符串就是“HTML Format”:


Private Declare Function RegisterClipboardFormat Lib 'user32' Alias 'RegisterClipboardFormatA'
(ByVal lpString As String) As Long
Dim CF_HTML As Long
Const RegHtml As String = 'HTML Format'
CF_HTML = RegisterClipboardFormat(RegHtml)

  你必须首先构建一个描述性的header,并在将HTML数据放入剪贴板之前先把它放到数据中。这个header会给其他程序提供描述版本信息、HTML起始数据的偏移量(offset),以及有关实际选择范围(actual selection)起始地方的信息。用户可能会选择的HTML文档的一部分甚至只是一个元素(比如一个table中的几行)作为一个选择区域。页面的其他部分,比如内联样式定义(inline style definitions)则可能会被要求进行完全渲染(render)。你不仅需要将最初所选择的HTML区域放入剪贴板,而且还需要放入一个header,它看起来就像是这样:


Version:1.0
StartHTML:000000258
EndHTML:000001491
StartFragment:000001172
EndFragment:000001411

  应用程序通过StartFragment和EndFragment属性来决定哪些数据需要粘贴,这些数据或许会(也可能不会)用剩下的HTML对所选择的部分进行格式安排。你必须将HTML注释放入数据中以便将来对所选部分进行识别。很明显,你必须在构建最后的header之前完成它,否则偏移量会有变化。一个用于所选数据的opening/closing注释标签分别是“<!--StartFragment-->”和“<!--EndFragment-->”

  列表1. 在你构建一个用于HTML片断的描述性header时这个程序(routine)会很有用。如果你放入整个HTML文档,则StartFragment标签会紧随<body>标签放入,而EndFragment标签则会被放在</body>之前。如果你只是放入一段HTML而不是整个文档,那么程序则只会放入<html>和<body>标签。

Public Function HtmlDescribed(ByVal Fragment As String) As String
 Dim Data As String
 Dim nPos As Long
 Const Description As String = 'Version:1.0' & vbCrLf & 'StartHTML:aaaaaaaaaa' & vbCrLf & _
'EndHTML:bbbbbbbbbb' & vbCrLf & 'StartFragment:cccccccccc' & vbCrLf & _
'EndFragment:dddddddddd' & vbCrLf
 Const FragmentStart As String = '<!--StartFragment-->'
 Const FragmentEnd As String = '<!--EndFragment-->'
 Const Fmt As String = '0000000000'

 ' Add the starting and ending tags for the
 ' HTML fragment by looking for <body> tag.
 nPos = InStr(1, Fragment, '<body', vbTextCompare)
 Select Case nPos
  Case 0
   Fragment = '<html><body>' & vbCrLf & FragmentStart & Fragment
  Case Else
   nPos = InStr(nPos, Fragment, '>')
   If nPos > 0 And nPos < Len(Fragment) Then
    Fragment = Left$(Fragment, nPos) & FragmentStart & Mid$(Fragment, nPos + 1)
   End If
 End Select

 nPos = InStr(1, Fragment, '</body', vbTextCompare)
 Select Case nPos
  Case 0
   Fragment = Fragment & FragmentEnd & vbCrLf & '</body></html>'
  Case Else
   Fragment = Left$(Fragment, nPos - 1) & FragmentEnd & Mid$(Fragment, nPos)
 End Select

 ' Build the HTML given the description, the
 ' fragment, and the context. And, replace the
 ' offset placeholders in the description with
 ' values for the offsets of StartHMTL,
 ' EndHTML, StartFragment, and EndFragment.
 ' Offsets need to be zero-based when placed on
 ' clipboard, so subtract 1
 ' from each before injecting.
 Data = Description & Fragment
 Data = Replace(Data, 'aaaaaaaaaa', Format$(Len(Description), Fmt))
最后更新时间:2008-05-28 11:40:54
文章评论
共有 0 位网友发表了评论
用户名: 新注册) 密码: 匿名评论 [查看所有评论]

评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
您可以用以下几种方式找到此文章

考试全流程