TIF in Picturebox anzeigen und skalieren

  • VB.NET
  • .NET (FX) 4.0

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    TIF in Picturebox anzeigen und skalieren

    Moin liebes Forum,

    ich habe hier und im Netz mehrmals gelesen wie man ganz einfach ein Bild mit der Maus bewegen kann. Immer wird mir vorgeschlagen, ein Pnael zu verwenden und die picturebox im Panel zu bewegen. Gibt es nicht auch eine Möglichkeit? Das Bild wirklich in der Picturebox zu bewegen? oder neu zu zeichnen oder irgendwie sowas?
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    Es kommt immer darauf an was du vorhast.
    Eigentlich ist es fast nie Sinnvoll ein Steuerelement als ganzes mit der Maus zu bewegen.
    Gewöhnlich ist es komfortabler das Bild per GDI+ zu Zeichnen und dann nur das Bild ohne Steuerelement zu bewegen. Ob das auf einem Panel (bietet sich an) oder einer PictureBox geschieht ist dabei egal.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    @razzzer530i meinst Du Steuerelement auf Form verschieben?
    @Schamash Man muss es einfach mal gemacht haben. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany das ist eigentlich immer so :)

    Anfangs klingt alles sehr schwer. Hinterher weiß man gar nicht mehr warum man es jemals anders gemacht hat :)
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    razzzer530i schrieb:

    ich habe hier und im Netz mehrmals gelesen wie man ganz einfach ein Bild mit der Maus bewegen kann. Immer wird mir vorgeschlagen, ein Pnael zu verwenden und die picturebox im Panel zu bewegen.
    "Immer" ist übertrieben, denn zumindest ich rate davon ab.
    Ich rate zu dem, was Schamash wohl meint, nur die korrekte Bezeichnung davon heisst "OwnerDrawing", und GDI+ ist nur ein klein Element davon. Und ich werfe es nicht nur in' Raum, sondern kann auch auf konkrete Anleitung verlinken: OwnerDrawing

    Auch bin ich beileibe nicht der Ansicht meiner Vorredner, dass man alles mal gemacht haben muss. Steuerelemente verschieben täte ich zB genau zu den Dingen zählen, die man nicht gemacht haben muss ;)
    Also erstmal danke an euch alle. Habe das ganze ja bereits so gemacht, dass ich eine Picturebox innerhalb eines Panels bewegt habe. Geht aber ist wohl nicht das was die saubere Lösung ist. Ich erkläre mal kurz worum es geht:

    Ich habe eine DGV mit X Zeilen in denen Faxe angezeigt werden. Rechts möchte ich diese Faxe anzeigen(sind TIF Dateien). Diese können Y viele Seiten haben. Habe das bis jetzt so gemacht, dass ich per MouseWheel zoomen kann und per Drag & Drop die Picturebox in der ich die TIF bzw. den entsprechenden Frame anzeige, in einem Panel bewege.

    Jetzt habe ich mir mal das OwnerDrawing angeguckt und das ist schon eher was ich suche. Damit kann ich das ganze viel leichter umsetzen. Werde mich da jetzt reinarbeiten und dein Tutorial durcharbeiten @ErfinderDesRades

    THX :)
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    @razzzer530i Ich denke nicht, dass Du da Ownerdrawing brauchst.
    Wie liegen denn mehrseitige Faxe vor?
    Was genau sind das für Items im DGV?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    Erstmal: Es können Mails und Faxe eingehen.
    Im DGV findet man Absender, Betreff, Datum,Zeit,Fach in dem die Nachricht angekommen ist, nicht sichtbar: Dateiname des Faxes/der Mail, Pfad.

    Nicht auf dem Bild zu sehen sind die Buttons mit denen ich die Faxe weiterleite. Rechts vom DGV habe ich eine Picturebox und eine Richtextbox in einem panel. Wenn Mail dann zeige ich die RTB mit Mailbody an, wenn Fax dann zeige ich das Fax(die TIF) in der Picturebox an.

    Mehrseitige Faxe liegen auch als eine einzige TIF Datei vor, die man in Frames betrachten muss. Diese kann man z.B: mit IrfanView durchschalten. Ich kriege diese Frames auch auseinander gefrimelt:

    VB.NET-Quellcode

    1. .ImageLocation = ("C:\DVWORK\" & fi.Name.Replace(fi.Extension, "") & ".tif")
    2. .SizeMode = PictureBoxSizeMode.Zoom
    3. il.Clear()
    4. oBitmap = New Bitmap(PictureBox1.ImageLocation)
    5. Dim intNumPages As Integer = oBitmap.GetFrameCount(
    6. Imaging.FrameDimension.Page)
    7. 'Combobox mit Nummern füllen
    8. If intNumPages > 0 Then
    9. Dim j As Integer
    10. For j = 1 To intNumPages
    11. il.Add(j)
    12. Next
    13. End If
    14. TextBox2.Text = "Seite 1/" & intNumPages
    15. icur = 1
    16. End With

    und schalte wenn mehrere vorhanden sind diese auch mit 2 Buttons hin und her:
    Weiter:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim imax As Integer = il.Count
    2. Dim imin As Integer = 1
    3. Dim i As Integer = 1
    4. If i >= imin AndAlso i < imax Then
    5. i += 1
    6. TextBox2.Text = "Seite " & i & "/" & imax
    7. oBitmap.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, CInt(i) - 1)
    8. icur = i
    9. With PictureBox1
    10. .Image = oBitmap
    11. .SizeMode = PictureBoxSizeMode.Zoom
    12. End With
    13. End If

    Zurück:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim imax As Integer = il.Count
    2. Dim imin As Integer = 1
    3. Dim i As Integer = icur
    4. If i > imin AndAlso i <= imax Then
    5. i -= 1
    6. TextBox2.Text = "Seite " & i & "/" & imax
    7. oBitmap.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, CInt(i) - 1)
    8. icur = i
    9. With PictureBox1
    10. .Image = oBitmap
    11. .SizeMode = PictureBoxSizeMode.Zoom
    12. End With
    13. End If


    Kann auch die Picturebox zoomen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub PictureBox_MouseWheel(sender As System.Object, e As MouseEventArgs) Handles PictureBox1.MouseWheel
    2. If e.Delta <> 0 Then
    3. If e.Delta <= 0 Then
    4. If PictureBox1.Width < 500 Then Exit Sub
    5. Else
    6. If PictureBox1.Width > 2000 Then Exit Sub
    7. End If
    8. PictureBox1.Width += CInt(PictureBox1.Width * e.Delta / 1000)
    9. PictureBox1.Height += CInt(PictureBox1.Height * e.Delta / 1000)
    10. End If
    11. End Sub


    auch die Picturebox bewegen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim cmd As Boolean = False
    2. Dim sp As Point
    3. Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
    4. cmd = True
    5. sp = e.Location
    6. End Sub
    7. Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
    8. If cmd Then
    9. PictureBox1.Location = PictureBox1.Location - sp + e.Location
    10. End If
    11. End Sub
    12. Private Sub PictureBox1_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseUp
    13. cmd = False
    14. End Sub


    Ist das an dieser Stelle ausreichend oder wäre ownerdrawing doch besser?

    Dazu würde ich gerne noch eine zweite Frage stellen:

    Wie kriege ich es hin, dass ich meine Picturebox immer im DIN A4 Format anzeige?
    Die Form ist sizable und arbeitet in Vollbild als auch klein, wobei sich die Picturebox und der Rest natürlich an die Form anpasst. Habe einfach absolut keine Idee, wie ich der Picturebox ein festes Seitenverhätnis mitgeben kann, sodass sie egal wie die Form aussieht sich trotzdem im Verhältnis nicht ändert(Wird die Form kleiner soll auch die pb kleiner werden ist ja klar. Aber das Verhätnis 1/1.41 soll gleich bleiben)
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    @razzzer530i OK, das dauert jetzt ein wenig länger.
    Gib bitte mal Deinem Thread einen nun passenderen Titel.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @razzzer530i Kannst Du mal bitte so eine Tiff mit mehreren Frames anhängen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    razzzer530i schrieb:

    Im DGV findet man Absender, Betreff, Datum,Zeit,Fach in dem die Nachricht angekommen ist, nicht sichtbar: Dateiname des Faxes/der Mail, Pfad.
    Ich sehe da ühaupt keinen Bedarf für herumzudraggende Controls.
    Ein DGV wird gebraucht, und ein Canvas-Control zum Anzeigen einer Bitmap. Das kann eine Picbox sein, aber evtl. vorteilhaft ein Extra-Canvas zu coden, von Control abgeleitet, weil OwnerDrawing geht auf jedem Control, und Picbox ist für sowas eiglich ziemlich überfrachtet mit Funktionalität, die man nicht braucht.

    Jdfs. Programm-Logik muss dann dafür sorgen, dass die richtige Bitmap angezeigt wird, und gezoomt und verschoben.

    Also vom Datenmodell her hat jede(s) Fax/Email mehrere Bildle, entweder nur eines oder (Tif) mehrere.
    Ist - vom Datenmodell her - fragwürdig, ob man Emails und Faxe über einen Kamm scheren kann - immerhin kann eine Email sonstwasfürwelche und sonstwieviele Anhänge enthalten, während ein Fax wohl genau ein Tiff ist?

    Aber wie dem auch sei: Gebraucht wird ein Bild-Anzeiger, der genau ein Bild anzeigt.
    @RodFromGermany muss die TIF leider als rar verpacken, da ich hier sonst die Rückmeldung "falsche Dateiendung" erhalte. Habe nur den Absender in der TIF oben ausgeschnitten also nicht wundern warum die Seiten nicht ganz gleich aussehen.

    @ErfinderDesRades Also Mail und Fax kann ich über ienen kamm scheren, da mich die Amhänge zum Verteilen nicht interessieren. Es geht ja darum, dass Mitarber nicht die komplexe Mailstruktur gefärden und alles mögliche falsch einsortieren. Die Nachrichten die ich in 2 bestimmte Fächer bekomme, kann ich so vollständig auseinandernehmen und mir alle Daten da raus ziehen.

    Was das Anzeigen angeht, geht es ja aktuell schon mit der Picturebox dass ich die TIF auseinander nehme und Frame für Frame neu lade. Allerdings ist das bewegen der Picturebox halt so eine Sache. Die innerhalb eines Panels selbst zu bewegen finde ich nicht richtig.
    Nur wie genau ich das male, so ein Bild einzeln in so ein Control oder wie auch immer, das weiß ich überhaupt nicht, da ich mich mit sowas absolut noch nie beschäftigt habe und somit gar nicht weiß was Sache ist.

    Aber wie kriege ich es denn z.B. bei einer Picturebox hin, dass das Seitenverhältnis immer gleich bleibt? Also z.B. das Verhätnis von A4 beibehält? gibt es die Möglichkeit irgendwie?

    OMG: PictureBox1.Height = Picturebox1.Width * 1.41
    ~braindead~

    Trotzdem noch auf der Suche nach der optimalen Lösung:)


    Dateien
    • tifdatei.rar

      (3,42 kB, 165 mal heruntergeladen, zuletzt: )
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „razzzer530i“ ()

    @razzzer530i Tut mir leid, aber mit W10, VS2013 FW4.5 kann ich Deine Datei nicht anzeigen, der IrfanView kann das. ;(
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    razzzer530i schrieb:

    Trotzdem noch auf der Suche nach der optimalen Lösung
    Warum packst Du das Bild nicht in einen nicht modalen Dialog, den kannst Du dann schieben und zerren und zoomen wie immer Du willst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany ich habe jetzt mal ein projekt gebastelt mit dem du ne tif öffnen kannst in picturebox, bild drehen kannst, seite wechseln kannst, zoomen und bewegen kannst(Mousewheel for zoom, drag & drop für bewegen)
    Was den modalen Dialog angeht, muss ich mir das erstmal anschauen wie das funktioniert. Guck dir mal an wie das funktioniert was ich gemacht habe und sag direkt wenn es rotz ist.

    ^^^^^^^^^^^^^^^^^^^^
    -TMTUT.rar-

    @ErfinderDesRades Was ich raus ziehe, packe ich in DataTables. Ich habe für dieses Programm ein DataSet mit 3 Tabellen, die erste für die Buttons die erzeugt werden, entstehen aus einer INI Datei heraus, die 2. die Den Inhalt der Mails und Faxe zwischenspeichert und die 3. die Vorschläge zum weiterleiten speichert. Diese werden in einer ini datei abgespeichert. Die letzte Tabelle ist "intelligent*hust* und lernt, welche Benutzer die Faxe von bestimmten Firmen oder Kunden öfter erhalten haben und schlägt diese dann direkt vor.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

    razzzer530i schrieb:

    Was den modalen Dialog angeht
    den NICHT modalen Dialog.

    VB.NET-Quellcode

    1. 'modal:
    2. dlg.ShowDialog()
    3. 'nicht modal:
    4. dlg.Show(Me)
    Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany das habe ich mir in der Zeit wo ich hier angemeldet bin schon 2-3 mal durchgelesen und einfach nichts verstanden. Jetzt ergibt das alles Sinn für mich und ich weiß jetzt wie ich das verwenden kann und wieso überhaupt. Werde ab dem nächsten Programm damit arbeiten und versuchen das gescheit anzuwenden. :D Lernen lernen lernen heißt es.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~