Springen naar inhoud


- - - - -
Solved

Verplaatsen Van Buttons, Controls In Runtime

Controls Runtime

  • Log in a.u.b. om te beantwoorden
Er zijn 5 reacties in dit onderwerp

#1 StevenR

StevenR

    Junior Developer

  • Leden
  • PipPip
  • 63 berichten
    Laatst bezocht 08 Mar 2012 00:53
  • LocatieBilzen

Geplaatst op 31 January 2010 - 13:06


Hey,


Gisteren was ik met iemand aan het discussieren over het
verplaatsen van buttons, en textboxen in runtime.

Uiteraard gaat dit door de top en de left property aan te passen.

Nu was mijn vraag eigenlijk , gaat dit ook door drag en drop in runtime ?

#2 Xymtrix

Xymtrix

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 533 berichten
    Laatst bezocht 13 Aug 2012 15:48
  • LocatieNederland

Geplaatst op 01 February 2010 - 11:49

Door drag en drop zal het niet lukken, omdat een button dan niet "weet" wanneer je die verplaatsen wilt of dat je knop wilt indrukken. Het verplaatsen can controls kan wel. Hierbij een Proof of Concept:
Visual Basic Code:
Public Class Form1

	'---------------------------------------------
	'| Button en een timer toevoegen aan je form |
	'| Hover over button todat het groen wordt   |
	'| Mouse plaatsen nar nieuwe locatie		 |
	'| en op linkermuisknop drukken.			 |
	'---------------------------------------------

	Private Buttonselected As Boolean = False
	Private DragButtonas As Boolean = False
	Private HoverTick As Integer = 0
	Private MouseX, MouseY As Integer

	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

	End Sub
	Private Sub Form1_MouseClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MouseClick
		Button1.Location = New Point(MouseX, MouseY)
		DragButtonas = False
		Buttonselected = False

	End Sub
	Private Sub Form1_mouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove
		MouseX = e.X
		MouseY = e.Y

		If Buttonselected = True Then
			Me.Refresh()
			DrawBox(CInt(Button1.Size.Width), CInt(Button1.Size.Height), CInt(MouseX), CInt(MouseY), Pens.Red)
		End If

	End Sub

	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
		Timer1.Stop()
		HoverTick = 0
		Buttonselected = False

		MessageBox.Show("Clicked the button")

	End Sub
	Private Sub Button1_MouseHover(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.MouseHover

		If Not Buttonselected = True Then
			Timer1.Start()

			DrawBox(CInt(Button1.Size.Width), CInt(Button1.Size.Height), CInt(Button1.Location.X), CInt(Button1.Location.Y), Pens.Orange)
		End If

	End Sub
	Private Sub Button1_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.MouseLeave
		If DragButtonas = False Then
			Buttonselected = False
		End If
		Me.Refresh()
	End Sub
	Private Sub DrawBox(ByVal Width As Integer, ByVal Lenght As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal RecColor As Pen)
		Dim g As Graphics
		g = Graphics.FromHwnd(ActiveForm().Handle)

		g.DrawRectangle(RecColor, (X - 1), (Y - 1), (Width + 1), (Lenght + 1))

		If Buttonselected = True Then
			g.DrawRectangle(Pens.Red, (X - 1), (Y - 1), (Width + 1), (Lenght + 1))
		End If

		g.Flush()
		g.Dispose()

	End Sub
	Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
		HoverTick += 1

		If HoverTick = 7 Then
			If Buttonselected = False Then
				DrawBox(CInt(Button1.Size.Width), CInt(Button1.Size.Height), CInt(Button1.Location.X), CInt(Button1.Location.Y), Pens.LawnGreen)
				Buttonselected = True
				DragButtonas = True
				HoverTick = 0
				Timer1.Stop()
			End If
		End If

	End Sub
End Class
Uiterraad verre weg van optimaal etc..
Soldiers, Sailors and Airmen of the Allied Expeditionary Force!
You are about to embark upon the Great Crusade, toward which we have striven these many months. The eyes of the world are upon you. The hopes and prayers of liberty-loving people everywhere march with you.
- Dwight D. Eisenhower

#3 wargod97

wargod97

    Senior Developer

  • Leden
  • PipPipPip
  • 187 berichten
    Laatst bezocht 12 Aug 2010 09:55

Geplaatst op 01 February 2010 - 20:52

ingewikkeeeeeeldddd

#4 Xymtrix

Xymtrix

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 533 berichten
    Laatst bezocht 13 Aug 2012 15:48
  • LocatieNederland

Geplaatst op 03 February 2010 - 17:23

Kan ingewikkelder, zie maar : Omdat ik dit een uiterst interessante vraagstuk vond ben ik hiermee doorgegaan. Daarom presenteer ik dan ook een nieuw stukje software waarbij je verschillende controls kunt selecteren en verplaatsen. Ik heb dit getest met 1 button, 3 tekstvelden en een label op 1 form. Voor alle gestresseerde :
Visual Basic Code:
Public Class Form1

	Private MouseX, MouseY As Integer
	Private ControlSelected As Boolean = False
	Private HoverOverControl As Boolean = False
	Private HoverTick As Integer = 0

	Private SelectedControl As SelectedControlProp
	Private Structure SelectedControlProp
		Dim Name As String
		Dim X As Integer
		Dim Y As Integer
		Dim Width As Integer
		Dim Height As Integer
	End Structure

	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
		mousePos.Start()
	End Sub
	Private Sub Form1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
		If ControlSelected = True Then
			MouseX = e.X
			MouseY = e.Y
			Me.Refresh()
			HighLightControl(MouseX, MouseY, SelectedControl.Width, SelectedControl.Height, Pens.Red)
		End If
	End Sub
	Private Sub Form1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
		If ControlSelected = True Then
			Dim xControl As Control
			For Each xControl In Me.Controls
				If xControl.Name = SelectedControl.Name Then
					xControl.Location = New Point(MouseX, MouseY)
				End If
			Next
			Me.Refresh()
			ControlSelected = False
			HoverOverControl = False
			mousePos.Start()
		End If
	End Sub
	Private Sub Hover_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles HoverMouse.Tick
		HoverTick += 1
		If HoverTick = 7 Then
			HoverMouse.Stop()
			mousePos.Stop()
			ControlSelected = True
			HighLightControl(SelectedControl.X, SelectedControl.Y, SelectedControl.Width, SelectedControl.Height, Pens.LawnGreen)
			HoverTick = 0
		End If
	End Sub
	Private Sub HighLightControl(ByVal X As Integer, ByVal Y As Integer, ByVal Width As Integer, ByVal Height As Integer, ByVal Color As Pen)
		Dim G As Graphics = Graphics.FromHwnd(ActiveForm.Handle)
		G.DrawRectangle(Color, X - 1, Y - 1, Width + 1, Height + 1)
		G.Flush()
		G.Dispose()
	End Sub
	Private Sub mousePos_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mousePos.Tick
		MouseX = Windows.Forms.Cursor.Position.X - (Me.Location.X + 4)
		MouseY = Windows.Forms.Cursor.Position.Y - (Me.Location.Y + 22)
		If ControlSelected = False Then CheckMousePosition(MouseX, MouseY)
	End Sub
	Private Sub CheckMousePosition(ByVal X As Integer, ByVal Y As Integer)
		Dim xControl As Control
		For Each xControl In Me.Controls
			If MouseX > xControl.Location.X And MouseX < (xControl.Location.X + xControl.Size.Width) Then
				If MouseY > xControl.Location.Y And MouseY < (xControl.Location.Y + xControl.Size.Height) Then
					If HoverOverControl = False Then
						HoverMouse.Start()
						HoverOverControl = True
						SelectedControl.Name = xControl.Name.ToString
						SelectedControl.X = xControl.Location.X
						SelectedControl.Y = xControl.Location.Y
						SelectedControl.Width = xControl.Width
						SelectedControl.Height = xControl.Height
						HighLightControl(SelectedControl.X, SelectedControl.Y, SelectedControl.Width, SelectedControl.Height, Pens.Orange)
					End If
					Exit Sub
				End If
			End If
		Next
		HoverMouse.Stop()
		HoverOverControl = False
		HoverTick = 0
		Me.Refresh()
	End Sub
End Class
Werkt hetzelfde zoals hierboven staat beschreven.
Je zou dit ook in een class moeten kunnen stoppen, maar daar heb ik geen tijd voor gehad.
Soldiers, Sailors and Airmen of the Allied Expeditionary Force!
You are about to embark upon the Great Crusade, toward which we have striven these many months. The eyes of the world are upon you. The hopes and prayers of liberty-loving people everywhere march with you.
- Dwight D. Eisenhower

#5 StevenR

StevenR

    Junior Developer

  • Leden
  • PipPip
  • 63 berichten
    Laatst bezocht 08 Mar 2012 00:53
  • LocatieBilzen

Geplaatst op 04 February 2010 - 09:20

Hey Xymtrix,

Vond je oplossing zeer interresant.
Heb ondertussen ook nog een andere manier gevonden.
is wel in C# maar ik veronderstel dat je dit wel allemaal zal kunnen lezen.
Deze oplossing kan voor zover ik heb geprobeerd alle controls verplaatsen ;)


Let me know what you think ;)


C Code:
 private void button1_MouseDown(object sender, MouseEventArgs e)
		{
			Button lt = (Button)sender;
			DoDragDrop(lt, DragDropEffects.Move);
		
		}

		private void panel1_DragDrop(object sender, DragEventArgs e)
		{
			this.button1.SetBounds(this.posx, this.posy, button1.Width, button1.Height);
	
		}

		private void panel1_DragEnter(object sender, DragEventArgs e)
		{
			e.Effect = DragDropEffects.Move;
		}

		private void panel1_DragOver(object sender, DragEventArgs e)
		{
			Point clientp = this.panel1.PointToClient(new Point(e.X, e.Y));
			this.posx = clientp.X;
			this.posy = clientp.Y;
		}

		private void Form1_DragDrop(object sender, DragEventArgs e)
		{
			this.button2.SetBounds(this.posx, this.posy, button1.Width, button1.Height);
	
		}

		private void Form1_DragOver(object sender, DragEventArgs e)
		{
			Point clientp = this.PointToClient(new Point(e.X, e.Y));
			this.posx = clientp.X;
			this.posy = clientp.Y;
		}

		private void Form1_DragEnter(object sender, DragEventArgs e)
		{
			e.Effect = DragDropEffects.Move;
		}

		private void button2_MouseDown(object sender, MouseEventArgs e)
		{
			Button lt = (Button)sender;
			DoDragDrop(lt, DragDropEffects.Move);
		}

Veranderd door pascalbianca, 04 May 2012 - 18:05.
VB taq omgezet naar C taq


#6 demodownload

demodownload

    Junior Developer

  • Leden
  • PipPip
  • 98 berichten
    Laatst bezocht 08 Jun 2012 00:21

Geplaatst op 04 May 2012 - 15:53

Heel interessant zeker en vast, maar is het ook mogelijk om een dynamische textbox die je op de volgende manier tot leven hebt geroepen:
Visual Basic Code:
	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
		Dim txtNieuwTextbox = New TextBox
		With txtNieuwTextbox
			.Name = "txtNieuwTextBox_" & "_mycntrl"
			.Location = New Point(40, 40)
			.Text = "Typ hier je gewenste text"
			.Multiline = True
			.Width = 100
			.Height = 100
		End With
		Me.Controls.Add(txtNieuwTextbox)
	End Sub


Deze dan te gaan bewegen en tekst in te typen en hierna nog eens via een dialog.font te gaan bewerken?

let me know!





Ook met taq Solved, Controls, Runtime voorzien

0 gebruiker(s) lezen dit onderwerp

0 lid(leden), 0 bezoeker(s), 0 anonieme gebruikers

Inloggen


[Solved] Untitled 1

Hosting provided by Combell
Met dank aan Jürgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
vbib.be - vbnet.be - vbdotnet.be - visualbasic.be