用VB制作多次剪贴板

Author: 黄陀 Date: 2001年 19期

?牐燱ord2000中的一个新功能就是可以进行多次复制、剪切、粘贴操作,多次复制的内容全部保存在剪贴板,不像以往剪贴板只保存最后一次复制或剪切的内容,对于较为复杂的修改工作实在是方便。然而因种种原因不能使用Word2000的朋友们就享受不到这种方便,因此,今天我们就自己制作一个类似的功能扩展软件。
  #1?牐犐杓扑悸?
  ?牐?1.这个剪贴板必须在屏幕的上方才方便使用,为此,我们使用Win32API函数中的SetWinDowPos函数,这个函数可以设置窗体的XYZ轴的位置和大小等。
  ?牐?2.必须随时侦测剪贴板的动向,为了能让更多初学者也能看懂,这里使用Timer控件定时监控,并采用ListBox控件储存从剪贴板得来的数据。
  ?牐?3.和Word一样,这里也采用工具栏按钮式的剪贴板,采用Toolbar控件,每次从剪贴板得来数据以后清空剪贴板,等到需要用的时候单击相应的按钮即可把内容复制到剪贴板,再在字处理器中粘贴即可(因为这毕竟不是Word的内部工具)。
  #1?牐牽丶柚?
  ?牐犗虼疤逯刑砑右桓鯨istBox控件,把它的Visible属性设为False;一个Timer控件,Interval属性设为1000;一个ToolBar控件,Align属性设为0,便于拖动位置。TextAlign属性设为1,令文本显示在按钮中间,在属性页中把它的“样式”设为1,成为Windows98风格的工具栏;两个CommandButton控件,Caption属性分别为“全部清空”和“清空第N个”;一个TextBox控件,用来输入要清除的条目的序号。完成的界面如图所示。(^19020503a^)
  #1?牐牬肴缦拢?
  ?牐燩rivate 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表示调用失败)
  ?牐燙onst SWP_NOMOVE = &H2
  ?牐燙onst SWP_NOSIZE = &H1
  ?牐燙onst HWND_TOPMOST = -1
  ?牐牐Фㄒ宄J闹?
  ?牐燚im cbtext As String
  ?牐燚im i,j As Integer
  ?牐燚im wd As Long
  ?牐燩rivate Sub Command1_Click()
  ?牐燜or j = List1.ListCount To 1 Step -1
  ?牐燣ist1.RemoveItem j - 1
  ?牐燭oolbar1.Buttons.Remove(j)??
  ?牐燦ext j  '清空所有的条目
  ?牐爄 = 0
  ?牐燾btext = "" '初始化变量
  ?牐燛nd Sub
  ?牐燩rivate Sub Command2_Click?煟?
  ?牐燣ist1.RemoveItem Val(Text1.Text)- 1 '移除索引号对应的条目(索引号从0开始)
  ?牐燭oolbar1.Buttons.Remove Val (Text1.Text)'移除对应的按钮
  ?牐燭ext1.Text = ""
  ?牐燛nd Sub
  ?牐燩rivate Sub Form_Load()?煟?
  ?牐爓d = 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轴坐标和调整窗口大小
  ?牐燛nd Sub
  ?牐燩rivate Sub Timer1_Timer()?煟?
  ?牐燨n Error Resume Next
  ?牐營f Clipboard.GetText=cbtext Or Clipboard.GetText=""Then'校验剪贴板的文字是否与前一次的重复且是否为空
  ?牐燛xit Sub
  ?牐燛nd If
  ?牐燜or j = 0 To List1.ListCount - 1
  ?牐營f Clipboard.GetText = List1.List(j)Then Exit Sub'校验是否有重复的,如有则不必再次复制
  ?牐燦ext j
  ?牐燾btext = Clipboard.GetText '获得剪贴板的文字
  ?牐爄 = i + 1
  ?牐燭oolbar1.Buttons.Add i,,Left(cbtext,10)+ "..." '把新复制到剪贴板的内容的前10个字符(相当于中文5个字符)作为摘要,添加到工具栏的新按钮的标题上
  ?牐燣ist1.AddItem cbtext,i - 1'把新获得的内容通过List控件的AddItem方法添加进去
  ?牐燜orm1.Height = 1000*(i + 1)/4 + 1000'设置窗体高度
  ?牐燙lipboard.Clear '清空剪贴板
  ?牐燛nd Sub
  ?牐燩rivate Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)??
  ?牐燙lipboard.Clear
  ?牐燙lipboard.SetText List1.List (Button.Index - 1)'把相应条目复制到剪贴板
  ?牐燛nd Sub