# Inhalt Picturebox in Zwischenablage



## Primax (24. November 2003)

Guten Morgen,
mal wieder ein kleines Problemchen...
Ich erstelle zur Laufzeit dynamisch Objekte in einer PictureBox, wie kann ich den Inhalt in die Zwischenablage bekommen.
Habe es mit,
SavePicture frm_Ausgabegrafisch.Picture1.Image, Programm_Pfad & "Test.bmp"
Clipboard.SetData LoadPicture(Programm_Pfad & "Test.bmp"), vbCFBitmap
aber ich bekomme den Inhalt nicht angezeigt.
Hat jemand eine Idee?


----------



## ANI (24. November 2003)

hallo Primax

der Befehl, um die Zwischenablage in eine Picturebox auszulesen lautet:

Picture1.Picture=Clipboard.GetData(vbCFBitmap)

Die Frage, die dabei aufkommt, ist:
Wird das Bild auch wirklich gespeichert?

Prüfe die Variable 'Programm_Pfad' ob diese mit '\' endet.

Ansonsten kann ich am Code nichts feststellen.

ANI


----------



## Primax (24. November 2003)

*Hallo Ani*

die Datei (test.bmp) wird erstellt, aber ich bekomme nur die leere Picturebox angezeigt. Der Inhalt (die Conrtols - Bilder) der Picturebox wird nicht mit gespeichert! Wieso?


----------



## ANI (24. November 2003)

hallo Primax,

schalte bitte bei deiner PictureBox 'frm_Ausgabegrafisch.Picture1' die AutoDraw-Eigenschaft auf 'TRUE'. Dann dürfte es funktionieren.

Das Image einer PictureBox ist nur virtuell und keine echte Bilddatei.

Noch ein Test:

Kopiere nach deiner Mehtode das Image in die Zwischenablage und öffne Paint auf deinem Rechner. Füge nun über das Menü 'Bearbeiten'-'Einfügen' die Zwischenablage ein. Erscheint das Bild, war die Zwischenablage erfolgreich.

ANI


----------



## Primax (24. November 2003)

*mal wieder*

Hallo Ani,
Danke schon mal, aber es funktioniert leider immer noch nicht. Ich habe nun die Funktion AutoReDraw beim Erstellen der Grafiken die auf meiner PictureBox liegen auf true gesetzt. Trotzdem kommt in der bmp-Datei immer nur ein weißes Blatt an, es werden die ganzen Images die ich erstelle (per code) nicht mit kopiert. Es scheint fast als wären sie auf dieser PictureBox gar nicht vorhanden.
Hier der Code mit dem ich die Controls erstelle:
Set TM_Master(i) = frm_Ausgabegrafisch.Controls.Add("VB.Image", "TM_Master" & i, frm_Ausgabegrafisch.Picture1)
             TM_Master(i).Visible = True
             TM_Master(i).Stretch = True
             TM_Master(i).Width = Breite
             TM_Master(i).Height = Hoehe_Master
             TM_Master(i).Left = Links
             TM_Master(i).Top = Oben
             TM_Master(i).Picture = LoadPicture(Programm_Pfad & Bild_Master)

Und hier das anlegen der Datei:
	SavePicture frm_Ausgabegrafisch.Picture1.Image, "c:\test.bmp"

Viele Grüße...


----------



## ANI (24. November 2003)

Hallo Primax,

der Fehler lieg daran, daß du ein VB.Image in deine PictureBox hinzufügst.

Ich würde dies so lösen:

1. eine PictureBox = Name: 'Original1' irgend wo im Formular (ausgeblendet)
2. Code: Factor ist der proportionale Faktor  zum Original, picPrint ist mein Bild, in welches ich hinein kopiere.

        If picOriginal1.ScaleWidth > picPrint.ScaleWidth Then
            Factor = picOriginal1.ScaleWidth / picPrint.ScaleWidth
        End If
        If picOriginal1.ScaleHeight > (picPrint.ScaleHeight / 2) Then
            Factor1 = picOriginal1.ScaleHeight / (picPrint.ScaleHeight / 2)
        End If

      If Factor > Factor1 Then
            Weite = picOriginal1.ScaleWidth / Factor
            Höhe = picOriginal1.ScaleHeight / Factor
        ElseIf Factor < Factor1 Then
            Weite = picOriginal1.ScaleWidth / Factor1
            Höhe = picOriginal1.ScaleHeight / Factor1
        ElseIf Factor > 0 And Factor1 > 0 Then
            Weite = picOriginal1.ScaleWidth / Factor
            Höhe = picOriginal1.ScaleHeight / Factor1
        ElseIf Factor > 0 And Factor1 = 0 Then
            Weite = picOriginal1.ScaleWidth / Factor
            Höhe = picOriginal1.ScaleHeight / Factor
        ElseIf Factor = 0 And Factor1 > 0 Then
            Weite = picOriginal1.ScaleWidth / Factor1
            Höhe = picOriginal1.ScaleHeight / Factor1
        ElseIf Factor = 0 And Factor1 = 0 Then
            Weite = picOriginal1.ScaleWidth
            Höhe = picOriginal1.ScaleHeight
        End If

        picPrint.PaintPicture picOriginal, (picPrint.ScaleWidth - Weite) / 2, (picPrint.ScaleHeight / 4) - (Höhe / 2), Weite, Höhe

Nun wird mein Originalbild verkleinert in die PictureBox 'picPrint' hinein kopiert.
Ich kann somit mehrere Bilder in eine PictureBox packen (anzeigen lassen) und diese dann mit 'SavePicture picPrint.Image, Dateiname' als ein Bild speichern.
Ich benutze diese Methode, um zwei Bilder miteinander zu vergleichen. Ein Bild im oberen Bereich und ein Bild im unteren Bereich meiner PictureBox.

Versuch mal diese Methode

ANI


----------



## Primax (27. November 2003)

*?*

Hallo ANI,
HÄ? 
Ich glaube zwar ich habe deinen code verstanden, aber wofür soll ich Ihn nehmen?
Dein Code macht doch folgendes:
 - kopiert ein Orignalbild in eine picPrint-PictureBox
 - die kannst du dann mit SavePicture speichern!


Aber bei mir sieht es doch so aus:
- ich habe auf einem Form bereits eine PictureBox (in der ich meine kleinen Bilder per Code erstelle)
- diese PictureBox kann ich doch dann auch mit SavePicture speichern!

Ich verstehe nicht warum ich den Umweg gehen sollte! Außerdem müßte ich dafür meine komplette Ausgabe wieder umstellen!

Mein Problem ist im Moment folgendes... er kopiert, aber nur eine leere Picturebox, und nicht die darauf zur Laufzeit erstellten Objekte.

Oder habe ich dich falsch verstanden...

grüße primax

Ich habe da gerade etwas rausgefunden...
wenn ich ein Bild in meine PictureBox einfüge (nicht per Code), und dann mit SavePicture frm_Ausgabegrafisch.Picture1.Image, "c:\test.bmp" arbeite, legt er das Bild mit Inhalt an!
Das ist also der Beweis, das die im Code erstellen Bilder (Images) die in der PictureBox erstellt werden nicht kopiert werden.
Was kann man da machen....


----------



## ANI (27. November 2003)

hallo Primax,

ich gluube, du hast das Prinzip etwas falsch verstanden.
Die Original-Picturebox dient als Original, von welchem ich dann das Image in die Druckvorlage 'picPrint' als kleines Bild an einer bestimmten Position ablege. 

Somit kann ich viele kleine Bilder in einer Art von Thumbnail in ein Bild ablegen und kann dann dieses als ein gesamtes Bild aller Thumbnail ausdrucken oder speichern.

Ich sende dir mal mein Beispiel zu.

ANI


----------



## Primax (28. November 2003)

*ja jetzt ist mir alles etwas klarer*

Aber...
wie kann ich das für mich nutzen?

Zur Zeit erstelle ich hiermit meine Objekte...
Set TM_Master(i) = frm_Ausgabegrafisch.Controls.Add("VB.Image", "TM_Master" & i, frm_Ausgabegrafisch.Picture1)
TM_Master(i).Picture = LoadPicture(Programm_Pfad & Bild_Master)
Vielleicht hast du ja eine Idee, wie ich es anders machen kann...

Ziel ist es, Bilder die ich per Code erstelle (auf einem Frame, oder einer PictureBox, oder einem Form?) in einem Bild zusammengefasst nach Word zu bekommen!

bis dann...


----------



## ANI (29. November 2003)

hallo Primax,

Controls sind niemals Bestandteil einer Picturebox, da diese kein Image hinterlassen.

Stelle dir deine Picturebox als Schachbrett vor.

OriginalBild.Picture = LoadPicture(A1.Bildpfad)
Schachbrett.PaintPicture OriginalBild, 0, 0, A1.width, A1.height
OriginalBild.Picture = LoadPicture(A2.Bildpfad)
Schachbrett.PaintPicture OriginalBild, A1.width, A1.height, A1.width, A1.height
OriginalBild.Picture = LoadPicture(A3.Bildpfad)
Schachbrett.PaintPicture OriginalBild, A.width * 2, A1.height * 2, A1.width, A1.height
OriginalBild.Picture = LoadPicture(A4.Bildpfad)
Schachbrett.PaintPicture OriginalBild, A.width * 3, A1.height * 3, A1.width, A1.height
OriginalBild.Picture = LoadPicture(A5.Bildpfad)

usw.

Schachbrett kann auch eine Form sein, wenn du direkt in eine Form die Bilder legen möchtest. Dann schreibst du eben 'Form.Image' statt Schachbrett.Image'.

Auf dieser Basis würde ich das Schachbrett mit den einzelnen Bildern füllen. Diese kann ich dann unter 'SavePicture Schachbrett.Image, Neuer Bildpfad' als Bild abspeichern.

Ich weis nicht warum du Controls einsetzen möchtest!

ANI


----------



## ANI (29. November 2003)

hallo Primax,

mir ist da noch etwas eingefallen.

Du kannst auf deinem Formular ein 'RichTextBox.Control' einsetzen und dieses schon komplett formatiert mit Überschriften, Adressfelder,Texte, Bild usw. füllen.

Einfügen von Bilder in die RTF-Box geht sehr einfach mit der Zwischenablage. 

Mit dem ShellExecute-Befehl kannst du dann das RTF-Dokument mit MS Word aufrufen lassen.

Das wars schon. 

ANI


----------



## Primax (1. Dezember 2003)

*Morgen ANI*

wenn ich dich jetzt richtig verstanden habe, soll ich die Images alle auf dem Form direkt erstellen, und dann mit savepicture das Form quasi als Image speichern. 
Probiere das jetzt mal aus. Melde mich dann...

P.S.: habe gerade damit angefangen, was ist A1...A5  ein laufender Name für Bilder?

Hallo ANI,
es läuft! zumindest zum Teil! Das mit dem Bild, habe ich nun dank deiner Hilfe hin bekommen. 
Aber jetzt möchte ich an jedes Bild noch ein Label anfügen. Wie mache ich das? Bei einem Label gibt es ja keine Loadpic.!
grüße
Primax

Noch etwas, das erstellte Bild ist max. so groß wie mein Screen!? Wenn meine grafische Ausgabe aber z.B. höher als der Screen ist, werden nur die Bilder angezeigt, die auf einen Screen 1024*768 passen. Auf mein Ausgabefrom ist aber mehr als nur dieser Ausschnitt vorhanden. Wie kann ich die volle Ausgabe in eine Datei speichern?
grüße primax


----------



## ANI (1. Dezember 2003)

hallo Primax,

A1, A2, A3 usw. wären deine Images auf deinem großen Bild, was du erstellen möchtest. Z.B. sollen die kleinen Bilder nur 200 x 200 Pixel groß sein. Also ist A1.width = 200 und A1.Height = 200. 

Wenn dein Bild größer als die Form wird, benutze bitte eine Picturebox. Diese kann im ausgeblendeten Zustand wesentlich größer als dein Screen dargestellt werden. AutoRedraw = True

Um ein Label an das Bild zu kleben machst du folgendes:

'printen von oben, unterhalb vom Image
PictureBox1.CurrentY = A1.height + 10
'printen von Links, Text zentrieren
PictureBox1.CurrentX = (A1.width/2) - (PictureBox1.Textwidth("Labeltext")/2)
'Label schreiben
PictureBox1.Print "Labeltext"

Ich hoffe du verstehs dies einigermassen.

ANI


----------



## Primax (3. Dezember 2003)

*guten morgen*

doch doch habe es einigermaßen verstanden...

Aber direkt noch eine Anmerkung:
Das was du jetzt vorgeschlagen hast ist ja ein Print auf die Form. Dabei kann ich nicht die Hintergrundfarbe einstellen wie das bei einem Label möglich ist

Anbei noch ein kleines Problem! Ich habe die Ausgabe nun so umgebaut, wie du es vorgeschlagen hast. Das heißt ich erstelle sie auf einer PictureBox mit paintpicture. Jetzt kann ich aber die Hintergrundfrabe nicht mehr ändern, denn dann sind die erstellten Bilder wieder weg! Die Idee... ich habe das Form für die Bildschirmausgabe mit einem blauen Hintergrund, wenn ich es drucken lasse, soll es aber mit weißem Hintergrund gedruckt werden.... hast du dazu auch eine Idee?

grüße Primax


----------



## ANI (3. Dezember 2003)

hallo Primax,

natürlich kannst du für das Label, welches du unter die Images hast printen lassen, den Hintergrund ändern. Printe vorher, bevor du den Namen unter das Bild printest, ein Rechteck mit der dementsprechenden FillColor-Farbe.

Um eine Picturebox einzufärben, gehst du folgendermaßen vor:

Picturebox.Cls
Picturebox.Backcolor = DeineFarbe

Dies muß erfolgen bevor der erste Zugriff (Print) auf die Picturebox stattfindet.

Nun kommt eine entscheidene Frage: 
Ist der Prozess, der die Images in die PictureBox printet wiederholbar? 

Wenn Ja, kein Problem. Dann einfach die BackColor-Farbe austauschen und den gleichen Prozess noch einmal durchlaufen lassen.

Wenn Nein, dann erstellst du dir einfach gleichzeitig zwei Pictureboxen (PicVorschau, PicDrucken), die eine mit blauem und die andere mit weisem Hintergrund.
Dann in beiden den gleichen Füllprozess ablaufen lassen.

Ich hoffe, daß ich mich verständlich ausgedrückt habe.

ANI


----------



## Primax (4. Dezember 2003)

*Hallo Ani*

Als erstes Mal muß ich Dir ein großes Lob aussprechen, Deine Tipps waren echt super! Vielen Dank für die viele Hilfe!

Anbei habe ich aber noch ein klitze kleines Problemchen...
Bei der Ausgabe erstelle ich nun mit painpicture Bilder auf dem Ausgabeform. Ich habe im Formload des forms eine prozedure,  in der ich Scrollbalken einbinde... Das funktioniert soweit sehr gut. Ich rufe das Fenster auf, als erstes (in der Formload-Funktion) wird die Erstellung ausgeführt, und danach werden die Scrollbalken angezeigt (falls erforderlich).
Das Problem ist nun, ich habe eine andere Funktion auf dem Formular, mit der man die Anordnung der Objekte ändern kann. Und zwar folgendermaßen:
Als erstes fragt dich das Programm wieviele Objekte du in horizontaler Richtung erstellen möchtest und dann zu jedem horizontalen Objekt wieviele vertikalen Objekte du erstellen möchtest.
Und genso ist es auch Programmiert (der Ablauf ist genauso, nicht gefaket!)
Jetzt habe ich das Problem, das nach dem Umsortieren, zwar die Picturebox, die für die Scrollbalken relevant ist, vergrößert wird, aber es werden keine Scrollbalken dazu angezeit!
Ich hätte gedacht, das die Scrollbalken mit meiner Prozedure automatisch erscheinen, sobald sich die Größe des Forms dem entsprechen ändert! Hast du eine Idee?

Grüße Primax...

Hier der Code für die Scrollbalken...
Picture1, ist die Picturebox die im Hintergrund liegt. Sie wird immer mit der Anordnung geändert!

Private Sub Form_Load()
    If Not Lademerker Then
        Umrechnungsfaktor = 20
        Call Ausgabe 'Hier rufe ich die normale Ausgabe auf! Das Ändern der Anordnung wird erst auf dem erstellten Formular gestartet!
    End If

'wird für die Scrollbalken benötigt
    FrmLoading = True
    With Me
        .Width = 5000 \ Umrechnungsfaktor
        .Height = 4000 \ Umrechnungsfaktor
    End With
    With Picture1
        .BorderStyle = 0
        .Move 0, 0
        PicBoxWidth = .Width
        PicBoxHeight = .Height
    End With
    With Picture2
        .Height = HGHTWDTH
        .Width = HGHTWDTH
        .BorderStyle = 0
        .ZOrder 0
    End With
    With HScroll1
        .left = 0
        .Height = HGHTWDTH
        .TabStop = False
        .ZOrder 0
    End With
    With VScroll1
        .Top = 0
        .Width = HGHTWDTH
        .TabStop = False
        .ZOrder 0
    End With
    FrmLoading = False    
End Sub

Private Sub Form_Resize()
    If FrmLoading Or Me.WindowState = vbMinimized Then Exit Sub
    Call GetScrollBars
End Sub

Private Sub GetScrollBars()
    Dim Height As Single
    Dim Width As Single
    Dim HScroll As Boolean
    Dim VScroll As Boolean

    On Error Resume Next
    Width = Me.ScaleWidth
    Height = Me.ScaleHeight

    HScroll = CBool(Width < PicBoxWidth)
    If HScroll Then
        Height = Height - HGHTWDTH
    End If

    VScroll = CBool(Height < PicBoxHeight)
    If VScroll Then
        Width = Width - HGHTWDTH

        If Not HScroll Then
            HScroll = CBool(Width < PicBoxWidth)
            If HScroll Then
                Height = Height - HGHTWDTH
            End If
        End If
    End If
    If HScroll Then
        With HScroll1
            .Top = Height
            .Width = Width
            .Min = 0
            .Max = PicBoxWidth - Width
            .LargeChange = Picture1.Width * 0.1
            .SmallChange = .LargeChange / 4
            .Visible = True
        End With
    Else
        With HScroll1
            .Value = 0
            .Visible = False
        End With
    End If
    If VScroll Then
        With VScroll1
            .left = Width
            .Height = Height
            .Min = 0
            .Max = PicBoxHeight - Height
            .LargeChange = Picture1.Height * 0.1
            .SmallChange = .LargeChange / 4
            .Visible = True
        End With
    Else
        With VScroll1
            .Value = 0
            .Visible = False
        End With
    End If
    If HScroll1.Visible And VScroll1.Visible Then
        With Picture2
            .Move VScroll1.left, HScroll1.Top
            .Visible = True
        End With
    Else
        Picture2.Visible = False
    End If
End Sub

Private Sub HScroll1_Change()
    Picture1.left = -HScroll1.Value
End Sub

Private Sub HScroll1_Scroll()
    HScroll1_Change
End Sub

Private Sub VScroll1_Change()
    Picture1.Top = -VScroll1.Value
End Sub

Private Sub VScroll1_Scroll()
    VScroll1_Change
End Sub


----------



## ANI (4. Dezember 2003)

hallo Primax,

was mir als erstes dazu einfallen würde, ist: Prüfe mal deine Form ob ScaleModeauf Twips eingestellt wurde/ist. Nach meines erachtens arbeitet VB immer mit Pixel, wenn Top, Left usw. positioniert wird.  

Es kann wahrscheinlich sein, das die beiden Scrollbalken da sind, aber außerhalb deine Form und daher nicht sichtbar.
.
Ansonsten kann ich an Deinem Code so keinen Fehler feststellen.

ANI


----------



## Primax (5. Dezember 2003)

*Hallo Ani*

das passt alles soweit, aber daran liegt es glaube ich nicht!

Kann es sein, das es ein Problem ist, wenn ich zur Laufzeit ein bereits geladenes Formular vergrößer? Das dann die Scrollbalken, die in der Form_load-Prozedure stehen, die Größenänderung nicht mitbekommen?

Kann ich die Scrollbalken nicht in der Änderungsprozedure erneut anpassen? Wenn ja, wie mache ich das?

Grüße Primax


----------



## ANI (5. Dezember 2003)

hallo Primax,

setze mal an die Stelle im Code, wo du HScroll1.Top und VScroll1.Left mit Zahlen füllst, einen Haltepunkt mit F9. Starte dann dein Programm und prüfe mal die Werte, die an Top und Left übergeben werden. Dann weist du, wo deine Scrollbalken sitzen.

ANI


----------

