Visual C# 2005實(shí)現(xiàn)拖拽一個(gè)圖片

2010-08-28 10:50:09來源:西部e網(wǎng)作者:

拖放操作當(dāng)然并非只限于文字,有許多的應(yīng)用程序都會(huì)提供拖放圖片的功能,以便提升操作的便利性。事實(shí)上不管是拖放哪一種類型的數(shù)據(jù),其間的作法都沒有太大的差異。
程序范例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(多重文件界面)文件窗口中。
    關(guān)鍵詞:VS.NET