| |
VB.NET - Ein- und UmsteigerGrafiken aufeinander positonieren | | | Autor: Sebi90 | Datum: 07.03.18 19:11 |
| Hallo User,
leider weis ich nicht ob folgendes mit VB.net funktioniert. Darum zum Anfang mal eine Grafik.
Ich möchte die roten Rechtecke in das schwarze Rechteck schieben. (Drag and Drop) Diese sollen sich aber darin nicht überschneiden. Bzw. gibt es eine Möglichkeit Einrastpunkte zu definieren ?
Leider weis ich nicht wie ich es besser Beschreiben sollte. Ich hoffe Ihr wisst was ich meine.
Geht sowas ? Könnte ich vielleicht ein kleine Beispiel haben ?
Grüsse | |
Re: Grafiken aufeinander positonieren | | | Autor: Kuno60 | Datum: 07.03.18 22:01 |
| Hallo,
natürlich kann man Grafiken per Maus verschieben und auch an bestimmten Positionen einrasten lassen.
Aber was meinst du mit "nicht überschneiden" und wo soll was einrasten? | |
Re: Grafiken aufeinander positonieren | | | Autor: Sebi90 | Datum: 07.03.18 22:04 |
| Hi,
die roten Rechtecke sollen sich nicht überlappen.
Einrasten soll das ganze links und rechts ausgemittelt. | |
Re: Grafiken aufeinander positonieren | | | Autor: Kuno60 | Datum: 07.03.18 22:14 |
| Eine Möglichkeit wäre über Steuerelemente, die man aus einem Container in einen anderen Container zieht. Dafür eignet sich besonders das FlowLayoutPanel. Da werden die Steuerelemente automatisch angeordnet und können über Margin und Padding ausgerichtet werden. Überschneidungen sind da nicht möglich.
Oder willst du es rein Grafisch innerhalb eines Steuerelements (z.B. UserControl) machen? | |
Re: Grafiken aufeinander positonieren | | | Autor: Sebi90 | Datum: 07.03.18 22:26 |
| Leider weis ich nicht was ich will bzw was es gibt. Darum Frage ich ja nach.
Bin für alles dankbar.
Ein kleines Beispiel wäre halt super, das ich ein bisschen rumprobieren kann. | |
Re: Grafiken aufeinander positonieren | | | Autor: Manfred X | Datum: 07.03.18 23:21 |
| Hallo!
[I]Leider weiß ich nicht, was ich will ...[/I]
Das ist ein Problem, das im Forum nur mit Einschränkungen
behandelt werden kann.
Zunächst wäre zu klären, was diese Rechtecke eigentlich
sein sollen. Controls? Regions auf der Form?
Was soll verschoben werden? Controls oder Daten (Bitmaps)?
Falls Bitmaps ...
Sollen diese Graphiken auch nach der Verschiebung in das
Zielrechteck noch verschiebbar sein?
Sollen diese Graphiken in einer "Gesamtgraphik" fusioniert
werden?
Schildere Deine Zielsetzung. Was willst Du erreichen? | |
Re: Grafiken aufeinander positonieren | | | Autor: Sebi90 | Datum: 08.03.18 05:59 |
| Moin,
das ganze soll einen Schaltkasten darstellen (schwarzes Rechteck)
Die roten Rechtecke sollen Komponenten darstellen, die in den Schaltschrank kommen.
Leider kommt es sehr oft vor, das zu kleine Schaltschränke für die ganzen Komponenten bestellt werden.
Das ganze soll dazu dienen, das man das ganze mal im groben auf die schnelle darstellen kann.
Das ganze soll auch im Zielrechteck noch verschiebbar sein.
Bzw. das man das rote Rechteck ins schwarze zieht. Das rote soll aber außerhalb erhalten bleiben.
Es könnte ja sein das die gleiche rote Komponente mehrmals in den Schaltschrank muss.
Gesamtgraphik wäre fürs ausdrucken toll.. | |
Re: Grafiken aufeinander positonieren | | | Autor: Manfred X | Datum: 08.03.18 16:32 |
| Ziemlich umfangreiche Anforderung.
Hier nur ein einfaches Beispiel.
Public Class frmMoveControls
Private Class cmp
Implements ICloneable
Public _bmp As Bitmap
Public _typ As String
Public _col As Color
Public _location As New Point
Public Sub New(bmp As Bitmap, typ As String)
_bmp = bmp : _typ = typ
_col = Color.Red
End Sub
Public Function Clone() As Object Implements ICloneable.Clone
Return MemberwiseClone()
End Function
End Class
Dim rasterheight As Integer = 50
Dim markercolor As Color = Color.Green
Dim cmps As New List(Of cmp) 'Komponenten
Dim cmps_inst As New List(Of cmp) 'Installierte Komponenten
Dim WithEvents compo_list As New PictureBox With
{.Parent = Me, .Width = 200, .Height = 600, .Left = 220}
'Schaltkasten für installierte Komponenten
Dim WithEvents compo_box As New PictureBox With
{.Parent = Me, .Width = 200, .Height = 600}
Private Sub frmMovePics_Load(sender As Object,
e As EventArgs) Handles MyBase.Load
Me.Size = New Size(600, 700)
For i As Integer = 0 To 5
Dim cmp As New cmp(New Bitmap(150, rasterheight), "C_" & i.ToString)
cmps.Add(cmp)
cmp._location = New Point(10, i * (rasterheight + 10))
Next i
End Sub
Private Sub pbox_Paint(sender As Object,
e As PaintEventArgs) Handles compo_list.Paint, compo_box.Paint
Dim lst As List(Of cmp)
lst = cmps_inst
If DirectCast(sender, PictureBox) Is compo_list Then lst = cmps
PaintCmpList(lst, e.Graphics)
End Sub
Private Sub PaintCmpList(clist As List(Of cmp), gr As Graphics)
gr.Clear(Color.White)
For i As Integer = 0 To clist.Count - 1
Using br As New SolidBrush(clist(i)._col),
pn As New Drawing.Pen(br, 2),
f As New Font("Arial", 10)
gr.DrawRectangle _
(pn, New Rectangle(clist(i)._location, clist(i)._bmp.Size))
Dim pt As Point = clist(i)._location
pt.Offset(20, 20)
gr.DrawString(clist(i)._typ, f, br, pt)
End Using
Next i
End Sub
Private Sub compo_list_MouseDown(sender As Object,
e As MouseEventArgs) Handles compo_list.MouseDown
For i As Integer = 0 To cmps.Count - 1
Dim cr As New Rectangle(cmps(i)._location, cmps(i)._bmp.Size)
If cr.Contains(New Point(e.X, e.Y)) Then
'Wahl einer zu installierenden Komponente
cmps(i)._col = markercolor
cmps_inst.Add(DirectCast(cmps(i).Clone, cmp))
Cursor = Cursors.Cross
Else
cmps(i)._col = Color.Red
End If
Next i
PaintCmpList(cmps, compo_list.CreateGraphics)
End Sub
Private Sub compo_box_MouseMove(sender As Object,
e As MouseEventArgs) Handles compo_box.MouseMove
If CheckMarker() >= 0 Then
If CheckTarget(New Point(e.X, e.Y)) Then
Cursor = Cursors.Cross
Else
Cursor = Cursors.No
End If
Else
Cursor = Cursors.Default
End If
End Sub
Private Function CheckTarget(mouseposition As Point) As Boolean
For i As Integer = 0 To cmps_inst.Count - 1
Dim cr As New Rectangle(cmps_inst(i)._location, cmps_inst( _
i)._bmp.Size)
cr.Inflate(5, 5)
If Not cmps_inst(i)._col = markercolor AndAlso
(Cursor <> Cursors.Default And cr.Contains(mouseposition)) Then
Return False
End If
Next i
Return True
End Function
Private Function CheckMarker() As Integer
For i As Integer = 0 To cmps.Count - 1
If cmps(i)._col = markercolor Then Return i
Next i
Return -1
End Function Rest im zweiten Teil | |
Re: Grafiken aufeinander positonieren (2.Teil) | | | Autor: Manfred X | Datum: 08.03.18 16:34 |
| Private Sub compo_box_MouseDown(sender As Object,
e As MouseEventArgs) Handles compo_box.MouseDown
If e.Button = MouseButtons.Left Then
If Cursor = Cursors.No Then Exit Sub
If Cursor = Cursors.Cross Then
Dim posy As Integer = (e.Y \ rasterheight) * rasterheight
For i As Integer = 0 To cmps_inst.Count - 1
If cmps_inst(i)._col = markercolor Then
'Installation der gewählten Komponente
cmps_inst(i)._location = New Point(10, posy + 10)
cmps_inst(i)._col = Color.Red
Cursor = Cursors.Default
PaintCmpList(cmps_inst, compo_box.CreateGraphics)
End If
Next i
Reset_cmps_color()
End If
ElseIf Cursor = Cursors.default Then
'Löschen einer installierten Komponente
Dim mp As Point = New Point(e.X, e.Y)
For i As Integer = cmps_inst.Count - 1 To 0 Step -1
Dim cr As New Rectangle(cmps_inst(i)._location, cmps_inst( _
i)._bmp.Size)
If cr.Contains(mp) Then
cmps_inst.RemoveAt(i)
PaintCmpList(cmps_inst, compo_box.CreateGraphics)
End If
Next i
End If
End Sub
Private Sub compo_box_MouseLeave(sender As Object,
e As EventArgs) Handles compo_box.MouseLeave
Cursor = Cursors.Default
For i As Integer = cmps_inst.Count - 1 To 0 Step -1
If cmps_inst(i)._col = markercolor Then cmps_inst.RemoveAt(i)
Next i
Reset_cmps_color()
End Sub
Private Sub Reset_cmps_color()
For i As Integer = cmps.Count - 1 To 0 Step -1
If cmps(i)._col = markercolor Then
cmps(i)._col = Color.Red
PaintCmpList(cmps, compo_list.CreateGraphics)
End If
Next i
End Sub
End Class | |
Re: Grafiken aufeinander positonieren (2.Teil) | | | Autor: Sebi90 | Datum: 08.03.18 20:05 |
| Vielen, vielen Dank !
Echt Klasse, ich werde jetzt mal 2-3 Tage grübeln
Schönen Abend noch | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevAniGif (VB/VBA)
Anzeigen von animierten GIF-Dateien
Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|