程序范例CH8_DemoForm012.vb示范如何在兩個(gè)PictureBox控件間拖曳圖片,其功能特性如下所示:
- 如圖8.13所示,您可以使用拖放方式將左側(cè)PictureBox控件中的圖片移動(dòng)至右側(cè)的PictureBox控件中,反之亦然,即左右兩個(gè)PictureBox控件都可以作為拖放源與置放目標(biāo)。
- 值得一提的是,如果您持續(xù)按著CTRL鍵,則可以使用拖放方式將左側(cè)PictureBox控件中的圖片復(fù)制到右側(cè)的PictureBox控件中(如圖8.14所示),反之亦然,即左右兩個(gè)PictureBox控件都可以作為拖放源與置放目標(biāo)。
圖8.13示范如何拖放圖片
圖8.14通過拖放操作來復(fù)制圖片
程序范例CH8_DemoForm012.vb在拖放操作方面的程序代碼如下所列:' 聲明一個(gè)常量以便偵測(cè)在拖曳期間CTRL鍵是否被按下。Const CtrlMask As Byte=8
Private Sub CH4_DemoForm065_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs)Handles MyBase.Load
' 由于目前無法在設(shè)計(jì)工具中去設(shè)定PictureBox控件
' 的AllowDrop屬性,所以必須通過程序代碼來加以設(shè)定。
picLeft.AllowDrop=True
picRight.AllowDrop=True
End Sub
' 處理左右兩個(gè)PictureBox控件的MouseDown事件。
' 當(dāng)鼠標(biāo)指針位于控件的范圍內(nèi)而且鼠標(biāo)按鍵被按下時(shí)便會(huì)引發(fā)此事件。
Private Sub PictureBox_MouseDown(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.MouseEventArgs)_
Handles picLeft.MouseDown, picRight.MouseDown
If e.Button=Windows.Forms.MouseButtons.Left Then
Dim pic As PictureBox=CType(sender, PictureBox)
' 初始化拖放操作。
If pic.Image IsNot Nothing Then
pic.DoDragDrop(pic.Image, _
DragDropEffects.Move Or DragDropEffects.Copy)
End If
End If
End Sub
' 處理左右兩個(gè)PictureBox控件的DragEnter事件。
' 當(dāng)某一個(gè)對(duì)象被拖曳至控件的范圍內(nèi)時(shí)就會(huì)引發(fā)
' 該控件的DragEnter事件。
Private Sub PictureBox_DragEnter(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.DragEventArgs)_
Handles picLeft.DragEnter, picRight.DragEnter
' 檢查被拖曳的數(shù)據(jù)的類型是否適用于目標(biāo)控件。
' 如果不適用,則拒絕置放。
If (e.Data.GetDataPresent(DataFormats.Bitmap))Then
' 如果在拖曳期間按著CTRL鍵,則執(zhí)行復(fù)制操作;
' 反之,則執(zhí)行移動(dòng)操作。
If(e.KeyState And CtrlMask)=CtrlMask Then
e.Effect=DragDropEffects.Copy
Else
e.Effect=DragDropEffects.Move
End If
Else
e.Effect=DragDropEffects.None
End If
End Sub
' 處理左右兩個(gè)PictureBox控件的DragDrop事件。
' 其實(shí)只要轉(zhuǎn)換發(fā)送者(sender)然后檢查Name屬性
' 以便確認(rèn)哪一個(gè)PictureBox控件要移除圖像,就
' 可以使用同一個(gè)事件處理函數(shù)來處理兩個(gè)PictureBox
' 控件的DragDrop事件。
Private Sub PictureBox_DragDrop(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.DragEventArgs)_
Handles picLeft.DragDrop, picRight.DragDrop
Dim pic As PictureBox=CType(sender, PictureBox)
pic.Image=_
CType(e.Data.GetData(DataFormats.Bitmap), Bitmap)
' 如果CTRL鍵沒有被按下的話,就使另外一個(gè)PictureBox
' 控件(也就是在DragDrop事件中并不是sender的那一
' 個(gè)PictureBox控件)中的圖像被移除。
If(e.KeyState And CtrlMask)<> CtrlMask Then
If pic.Name="picLeft" Then
picRight.Image=Nothing
Else
picLeft.Image=Nothing
End If
End If
End Sub
前面這兩個(gè)關(guān)于文字與圖片的拖放操作范例都是在同一個(gè)窗體上的兩個(gè)控件間進(jìn)行,其實(shí)它們也可在同一個(gè)應(yīng)用程序內(nèi)之不同窗體上的控件間拖放。下一個(gè)程序范例將示范如何接受從另外一個(gè)應(yīng)用程序拖放而來的項(xiàng)目,在此一程序范例中,將接受從Windows資源管理器拖放而來的文件。
拖放文件在Windows資源管理器中使用拖放操作來移動(dòng)或復(fù)制文件是大家所慣用的方式。Windows資源管理器充分支持拖放操作,而且這也是非常多用戶所偏愛的文件使用方式。此外,許多用戶非常習(xí)慣直接從Windows資源管理器將文件拖放至對(duì)應(yīng)的應(yīng)用程序中來打開它們。例如,從Windows資源管理器將一個(gè) .doc 文件拖放至Microsoft Word即會(huì)將該文件打開在Microsoft Word中。
圖8.15所示是程序范例CH8_DemoForm013.vb的運(yùn)行界面。顯而易見地,您可以從Windows資源管理器將一個(gè)或多個(gè)文件拖放至窗體上的ListBox控件中,而被拖放的文件的文件名稱會(huì)被添加到ListBox控件中。以下是CH8_DemoForm013.vb的程序代碼內(nèi)容:
圖8.15示范如何拖放文件
Private Sub ListBox1_DragEnter(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DragEventArgs)_
Handles ListBox1.DragEnter
If e.Data.GetDataPresent(DataFormats.FileDrop)Then
e.Effect=DragDropEffects.All
End If
End Sub
Private Sub ListBox1_DragDrop(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DragEventArgs)_
Handles ListBox1.DragDrop
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
Dim MyFiles()As String
Dim i As Integer
' 將文件賦值給一個(gè)數(shù)組。
MyFiles=_
CType(e.Data.GetData(DataFormats.FileDrop), String())
' 循環(huán)處理數(shù)組并將文件添加到列表中。
For i=0 To MyFiles.Length-1
ListBox1.Items.Add(MyFiles(i))
Next
End If
End Sub
請(qǐng)注意這里在ListBox控件的DragEnter事件處理函數(shù)中將Effect屬性設(shè)定成DragDropEffects.All。由于文件本身實(shí)際上并沒有被移動(dòng)或復(fù)制,因此拖放源如何設(shè)定AllowedEffects將無關(guān)緊要,設(shè)定All表示對(duì)任何的FileDrop都會(huì)啟用置放。
就本范例而言,DataFormats.FileDrop格式會(huì)含有每一個(gè)被置放的文件的完整路徑。本范例的操作邏輯是將所有被拖放的文件的完整路徑填入ListBox控件中,當(dāng)然,您可以采用其他作法。例如,您可以將被拖放的文件打開在一個(gè)MDI(多重文件界面)文件窗口中。