用VB制作多次剪贴板

Word2000中的一个新功能就是可以进行多次复制、剪切、粘贴操作,多次复制的内容全部保存在剪贴板,不像以往剪贴板只保存最后一次复制或剪切的内容,对于较为复杂的修改工作实在是方便。然而因种种原因不能使用Word2000的朋友们就享受不到这种方便,因此,今天我们就自己制作一个类似的功能扩展软件。
  #1 设计思路
   1.这个剪贴板必须在屏幕的上方才方便使用,为此,我们使用Win32API函数中的SetWinDowPos函数,这个函数可以设置窗体的XYZ轴的位置和大小等。
   2.必须随时侦测剪贴板的动向,为了能让更多初学者也能看懂,这里使用Timer控件定时监控,并采用ListBox控件储存从剪贴板得来的数据。
   3.和Word一样,这里也采用工具栏按钮式的剪贴板,采用Toolbar控件,每次从剪贴板得来数据以后清空剪贴板,等到需要用的时候单击相应的按钮即可把内容复制到剪贴板,再在字处理器中粘贴即可(因为这毕竟不是Word的内部工具)。
  #1 控件设置
   向窗体中添加一个ListBox控件,把它的Visible属性设为False;一个Timer控件,Interval属性设为1000;一个ToolBar控件,Align属性设为0,便于拖动位置。TextAlign属性设为1,令文本显示在按钮中间,在属性页中把它的“样式”设为1,成为Windows98风格的工具栏;两个CommandButton控件,Caption属性分别为“全部清空”和“清空第N个”;一个TextBox控件,用来输入要清除的条目的序号。完成的界面如图所示。((图1)

图1
图1

  #1 代码如下:
   Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long ByVal hWndInsertAfter As Long,ByVal x As Long,ByVal y As Long ByVal cx As Long,ByVal cy As Long,ByVal wFlags As Long)As Long
   '声明所用的SetWindowPosAPI函数,hwnd是窗体的句柄,hWndInsertAfter是窗体在屏幕的Z轴上的相对位置,X是窗体最左边的位置,Y是窗体最顶端的位置,cx、cy反之,wFlags是对窗体的大小、XYZ轴位置进行设置的显示标志,该函数的返回值是函数调用是否成功的标志(0表示调用失败)
   Const SWP_NOMOVE = &H2
   Const SWP_NOSIZE = &H1
   Const HWND_TOPMOST = -1
   '定义常数的值
   Dim cbtext As String
   Dim i,j As Integer
   Dim wd As Long
   Private Sub Command1_Click()
   For j = List1.ListCount To 1 Step -1
   List1.RemoveItem j - 1
   Toolbar1.Buttons.Remove(j)
   Next j '清空所有的条目
   i = 0
   cbtext = "" '初始化变量
   End Sub
   Private Sub Command2_Click
   List1.RemoveItem Val(Text1.Text)- 1 '移除索引号对应的条目(索引号从0开始)
   Toolbar1.Buttons.Remove Val (Text1.Text)'移除对应的按钮
   Text1.Text = ""
   End Sub
   Private Sub Form_Load()
   wd = SetWindowPos(Form1.hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE Or SWP_NOSIZE) '用SetWindowPos函数把窗体固定,HWND_TOPMOST是指定窗体在屏幕的所有窗体Z轴最上方,SWP_NOMOVE和SWP_NOSIZE用OR连接,表示不允许移动窗口的X/Y/Z轴坐标和调整窗口大小
   End Sub
   Private Sub Timer1_Timer()
   On Error Resume Next
   If Clipboard.GetText=cbtext Or Clipboard.GetText=""Then'校验剪贴板的文字是否与前一次的重复且是否为空
   Exit Sub
   End If
   For j = 0 To List1.ListCount - 1
   If Clipboard.GetText = List1.List(j)Then Exit Sub'校验是否有重复的,如有则不必再次复制
   Next j
   cbtext = Clipboard.GetText '获得剪贴板的文字
   i = i + 1
   Toolbar1.Buttons.Add i,,Left(cbtext,10)+ "..." '把新复制到剪贴板的内容的前10个字符(相当于中文5个字符)作为摘要,添加到工具栏的新按钮的标题上
   List1.AddItem cbtext,i - 1'把新获得的内容通过List控件的AddItem方法添加进去
   Form1.Height = 1000*(i + 1)/4 + 1000'设置窗体高度
   Clipboard.Clear '清空剪贴板
   End Sub
   Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
   Clipboard.Clear
   Clipboard.SetText List1.List (Button.Index - 1)'把相应条目复制到剪贴板
   End Sub