2012-02-09 64 views
3

我看了一下「如何用Javascript單擊鼠標來放置圖像?」但它有一小段Java;比我對Java的知識大得多。這是我在過去一週內找到最接近的答案。如何使用vb.net點擊鼠標按鈕來放置/拖放圖像?

下面是我想要做的(不知道它是否可能): 我有一個面板和一個帶有3個按鈕的工具條。每個按鈕代表不同的圖像。我想單擊一個按鈕(一次),然後移動到面板中,每次單擊鼠標按鈕時,它都會點擊圖像。只有當我點擊相同的按鈕或其他按鈕時,這才結束。我不想每次都將圖像拖入面板。換句話說,按鈕保持按下狀態,事件/動作保持活動狀態。

任何幫助將不勝感激。

+0

Javascript!= Java – colithium 2012-02-09 20:13:51

回答

2

這是一個示例應用程序。它只是一個帶有ToolStrip的表單,還有一些按鈕以及添加到每個按鈕的圖像。每個按鈕的關鍵屬性是CheckOnClick=True,這將保持按下按鈕。

ToolStrips沒有類似於單選按鈕的功能,所以您必須自己「取消」其他ToolStripButtons,這是我在ItemClicked事件中處理的。

Public Class Form1 
    Private _ActiveImage As Image = Nothing 

    Private Class ImagePoint 
    Public Location As Point 
    Public Image As Image 

    Public Sub New(ByVal image As Image, ByVal location As Point) 
     Me.Image = image 
     Me.Location = location 
    End Sub 
    End Class 

    Private _Images As New List(Of ImagePoint) 

    Public Sub New() 
    InitializeComponent() 
    Me.DoubleBuffered = True 
    End Sub 

    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles MyBase.Paint 
    For Each imageItem As ImagePoint In _Images 
     e.Graphics.DrawImage(imageItem.Image, imageItem.Location) 
    Next 
    End Sub 

    Private Sub ToolStrip1_ItemClicked(ByVal sender As Object, ByVal e As ToolStripItemClickedEventArgs) Handles ToolStrip1.ItemClicked 
    For Each toolButton As ToolStripButton In ToolStrip1.Items.OfType(Of ToolStripButton)() 
     If toolButton.CheckOnClick Then 
     If e.ClickedItem.Equals(toolButton) Then 
      _ActiveImage = e.ClickedItem.Image 
     Else 
      toolButton.Checked = False 
     End If 
     End If 
    Next 
    End Sub 

    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseDown 
    If _ActiveImage IsNot Nothing AndAlso e.Button = MouseButtons.Left Then 
     _Images.Add(New ImagePoint(_ActiveImage, e.Location)) 
     Me.Invalidate() 
    End If 
    End Sub 
End Class 

這個例子只是使用一個簡單的類來保存這些圖像被放置在什麼位置和油漆事件只是列表循環和油漆的形象。

如果在將來刪除圖像,則在繪製任何圖像之前,必須先撥打e.Graphics.Clear(Color.White)

+0

從個人經驗來看,對於除了最簡單的場景之外的所有場景,從頭開始重新繪製所有繪畫事件通常都是一個壞主意。當一些東西被拖到表單上時,通常會產生許多閃爍,並執行大量無用的工作。將它繪製到位圖是一種方法。但除此之外,你幾乎寫了我的答案中描述的代碼。所以+1 – colithium 2012-02-09 21:44:26

+0

@colithium這就是爲什麼我欺騙並在構造函數中添加了'Me.DoubleBuffered = True'的原因。 :-) +1右後衛。 – LarsTech 2012-02-09 21:51:02

+0

謝謝LarsTech的快速響應。我是新手,所以我複製了你的代碼並插入了toolstrip1,看看我會得到什麼錯誤或線索。想想我會弄清楚如何添加圖像在哪裏;但沒有任何反應......沒有錯誤或線索。那麼你是否有可能向我展示一個圖像在你的代碼中工作的例子? – UBel 2012-02-10 13:18:00

1

對於按鈕UI,請查看單選按鈕/複選框的備用樣式。他們有一個「切換按鈕」模式,聽起來像你所需要的。

您可以通過在面板上檢測鼠標向下事件,獲取座標,創建圖像控件以及在其中放置圖像副本的動作,但有更好的方法。

使用單個圖像控件填充面板(填充以便處理大小調整,圖像控件應始終與面板的大小相同)。創建一個與圖像控件大小相同的新位圖並將其與其關聯(設置圖像屬性)。獲取位圖的圖形對象(Graphics.FromImage()我認爲))。清除()它與背景顏色(Color.White?)。

在啓動時預加載您的三張圖像並編寫代碼以在它們之間切換,每次選擇不同的按鈕時選擇「活動的」圖像。在鼠標向下事件中,您可以輕鬆獲取點擊的座標。使用myGraphics.DrawImage(...)將該位置的活動圖像繪製到位圖上。然後,您可以將該位圖保存到一個文件或做任何你想要的。所有這些概念都有很多例子,Google它們。

如果你想在你拖拽它們之後與圖像進行交互(比如再次移動它們),那麼你將需要維護一個數據結構來跟蹤你丟棄的內容和位置。具有Point和Image引用的簡單類就足夠了。每個drop應該添加一個條目到List(Of ...)這些對象。您可能需要編寫代碼,例如「哪個圖像位於當前鼠標位置?」。這可以通過迭代列表並進行點/矩形相交測試來完成。

+0

感謝您的快速響應。你能提供一個片段的例子嗎?我是新手,不知道如何去處理你的建議。 – UBel 2012-02-10 13:24:51

0
Private Sub ToolStripSound_Click(sender As Object, e As EventArgs) Handles ToolStripSound.Click 

    If ToolStripSound.Checked = False Then 
     ToolStripSound.Checked = True 
    Else 
     ToolStripSound.Checked = False 
    End If 


End Sub 

Private Sub ToolStripSound_CheckedChanged(sender As Object, e As EventArgs) Handles ToolStripSound.CheckedChanged 

    ' ToolStripSound.Checked = True 
    If ToolStripSound.Checked = True Then 
     Me.ToolStripSound.Image = Global.Traffic_Lights.My.Resources.Resources.Oxygen_Icons_org_Oxygen_Status_audio_volume_high 
    Else 
     Me.ToolStripSound.Image = Global.Traffic_Lights.My.Resources.Resources.Oxygen_Icons_org_Oxygen_Status_audio_volume_muted 
    End If 

End Sub