用VB制作多次剪贴板 黄陀 2001年 19期 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控件,用来输入要清除的条目的序号。完成的界面如图所示。(^19020503a^)   #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