Per Drag and Drop Grafiken verschieben?

daDom

Erfahrenes Mitglied
Hi!

Ich brauche ein Programm, mit dem ich Grafiken verschieben kann.

Das Prinzip ist folgendes:
_.....Die Stadthalle hat einen Grundriss von den einzelnen Säälen.
_.....Auf diesen Grundriss platzieren die Angestellten Tische, Stühle usw...
_.....Da denen es aber leicht umständlich erscheint, dies jedes Mal über Photoshop zu machen, möchten sie ein eigenes, einfacheres Programm

Ziel dieses programmes soll folgendes sein:
_.....Grundriss in Imagebox o.ä. laden
_.....Verschiedenen Komponenten auswählen (Tische, Stühle usw...)
_.....und dann eben diese Verschieben...

Ist das irgendwie möglich?

D.h. ob, weiss ich, nur wie muss ich wissen...

Wichtig: Ist es möglich, die ganzen Komponenten, die dann auf der Imagebox liegen in ihrer Position als Bild abzuspeichern?
Sonst hat das ganze ja keinen Sinn...

grüsse
daDom
 
In diesem Thread hab ich was zu Drag&Drop von Buttons geschrieben. Die Buttons kannst durch Images ersetzen. Für jedes Objekt erstellst du dann dynamisch ein neues Image das positioniert werden kann.

Speichern als Bild könnte z.B. so aussehen:

Eine versteckte PictureBox dient als Puffer zum erzeugen der Grafik.
Du lässt eine Schleife durch alle Steuerelemente des Forms laufen, wenn es sich um Images handelt liest du das Bild und zeichnest es in die PictureBox, als Koordinaten verwendest du die Top/Left-Eigenschaften des Images.
Wenn alles drin ist kannst den Inhalt der PictureBox speichern.
Wenn du alle Images in einem Steuerelementefeld hast reicht es auch die Schleife nur da drüber laufen zu lassen.
 
Zuletzt bearbeitet:
Hi!

Cool, das hört sich ja vielversprechend an...

Ich schau mir - wenn meine Zeit sich dazu bereit erklärt - deinen Button-Verschiebe-Code mal genauer an.

Aber mir bleibt noch immer schleierhaft, wie ich alle Objekte in einer PictureBox inklusive 'Hintergrundbild' (Grundriss) als neues Bild speichern kann.

Geht selbiges nur mit einer Picturebox oder auch mit einem Image-Element?

//edit: Das mit dem Raster habe ich nicht gnaz verstanden - kannst du mir vielleicht einmal ausführlich beschreiben, wie ich so etwas hinbekomme?
Zitat: Dann beim Inneren Durchlauf auf X/Y einen Punkt zeichnen.
Das verstehe ich nicht - zeichnet das Programm dann Pixel für Pixel?

grüsse
daDom
 
Grid mit dem Button cmdGridOnOff ein- bzw. ausschalten
Code:
Dim GridWidth As Integer
Dim GridWidth2 As Integer
Dim GridVisible As Boolean

Private Sub cmdGridOnOff_Click()
    GridVisible = Not GridVisible
    Form_Paint
End Sub

Private Sub Form_Load()
    GridWidth = 100 'Abstand zwischen den Punkten
    GridWidth2 = 500 'Abstand nach dem ein dicker Punkt kommen soll
    GridVisible = False
    Me.ForeColor = vbBlack 'Farbe für die Punkte
End Sub

Private Sub Form_Paint()
On Error Resume Next
    Me.Cls
    If GridVisible = True Then
        Dim maxX As Single
        Dim maxY As Single
        maxX = Me.Width
        maxY = Me.Height
        For X = 0 To maxX Step GridWidth
        For Y = 0 To maxY Step GridWidth
            Me.DrawWidth = 1
            If X Mod GridWidth2 = 0 Then
                If Y Mod GridWidth2 = 0 Then
                    Me.DrawWidth = 2
                End If
            End If
            Me.PSet (X, Y), Me.ForeColor
        Next
        Next
    End If
End Sub
 
Zuletzt bearbeitet:
Hi!

Sauber!
Ich dachte jedoch, das diese Funktion Linien und nicht Punbkte zeichnen würde...
Aber das klappt tatsächlich!

Lässt sich bestimmt gut gebrauchen!

Danke!

Bin mal gespannt, ob ich das mit dem Programm hinbekomme.
Wenn ich soweit bin, melde ich mich wieder...
(Müsstest mir dann helfen. Speicherfunktion erläutern etc...)

gruß
daDom
 
Das Raster lässt sich natürlich beliebig verändern, z.B. könnte man jeden 5. Punkt dicker darstellen, in einer anderen Farbe oder heller/dunkler.
Hab den Code oben entsprechend editiert.

Wegen der Speicherfunktion:
Man muss zuerst alle Bilder in den Image-Elementen inklusive dem Hintergrundbild auf ein Bild bekommen.
Dazu würde ich eine PictureBox anlegen, Visible auf False stellen, damit sie unsichtbar ist, AutoRedraw auf True stellen und in ihr das Bild zusammen setzen.
Code:
Private Sub cmdCreateImage_Click()
    Dim C As Control
    For Each C In Controls
        If C.Name = "Bild" Then
            picBild.PaintPicture C.Picture, C.Left, C.Top
        End If
    Next
End Sub
Die Schleife durchläuft alle Steuerelemente auf der Form, wenn der Name eines Steuerelements "Bild" ist (in meinem Drag&Drop-Beispiel wird ein Steuerelementefeld verwendet, daher haben alle Bilder den gleichen Namen) wird der Inhalt (Picture-Eigenschaft) in das Gesamtbild (die PictureBox) kopiert. Als Koordinaten für X und Y werden die Left und Top Eigenschaften des Steuerelements verwendet.
Vorher solltest du natürlich das Hintergrundbild in die PictureBox kopieren.
Die Images müssen alle gültige Bilder enthalten, sonst kommt es bei PaintPicture zu einem Laufzeitfehler.
 
Hatte bisschen Langeweile und hab mal ein Beispielprogramm geschrieben das so einige Funktionen beinhaltet.
Mit dem Programm kann man einen Hintergrund (z.B. Grundriss für Gebäude) laden und darauf beliebig viele Objekte platzieren, verschieben und wieder löschen.
Momentan werden nur vorgegebene Bilddateien geöffnet, kannst den Code ja so anpassen das man den Hintergrund selbst bestimmen kann und die Einrichtungsobjekte automatisch ausgelesen werden.
Die Arbeit kann dann per Button gespeichert werden und liegt als "Ergebnis.bmp" im Programmverzeichnis (auch hier kannst du einen Speichern-Unter-Dialog einbauen).
Einige Funktionen wie z.B. Drehen der Objekte sind vorhanden, aber noch nicht fertig, kannst ja ergänzen wenn du das brauchst.
 

Anhänge

  • einrichtungsplaner.zip
    5,3 KB · Aufrufe: 76
Hi!

Boa krass alter, das ist ja schon richtig gut....

Ich arbeite mich mal rein, wenn Zeit da ist...

Momentan geht es mit der Schule in den Endspurt...

gruß
daDom
 
So, ich habe nun am Programm gearbeitet und habe ein weiteres Problem:
Ich möchte die eingefügten Bilder an deren Position samt des Hintergrundbildes(Grundriss) als Projektdatei speichern.

Mal etwas näher eingegangen:
Code:
PosTop = Einrichtung(Sel).Top
PosLeft = Einrichtung(Sel).Left
Dies ist der Teil, wo ich die Position des aktuell selektierten Objektes an die Variablen übergebe...
Doch ich muss ja von allen Objkekte, die eingefügt wurden die Positionen an Variablen übergeben und einzeln in eine Textdatei bzw. in eine DB speichern...
Die Funktion des speicherns ist mir durchaus bekannt, doch wie kann ich wirklich alle Objekte speichern?
Mit Einrichtung.Selected = Einrichtung.Selected +1 funktioniert es nicht...

Gruß
daDom
 
In einer Schleife alle Steuerelemente durchlaufen
Code:
Dim C as Control
For each C in Controls
    If C.Name = "Einrichtung" Then
        'Steuerelement gefunden, jetzt muss es noch gespeichert werden
    End If
Next
Ungetestet, aber so ähnlich müsste es funktionieren.

Wenn der Index von "Einrichtung" lückenlos ist und die Grenzen bekannt sind gehts auch mit
Code:
Dim i as Integer
For i = UntereGrenze To ObereGrenze
    'Einrichtung(i) speichern
Next
 
Zurück