Wir erstellen Schritt für Schritt ein DiaShow-Programm, mit welchem sich alle Bilder eines Ordners entweder nacheinander oder in zufälliger Reihenfolge anzeigen lassen. Anforderung und Vorbereitungen Was soll das Programm können?
Freie Auswahl des Ordners Ermitteln aller oder nur bestimmter Dateien eines Ordners Programm optional über Aufrufparameter steuerbar
Gestaltung und Oberfläche Unser DiaShow-Programm besteht selbst nur aus einer einzigen Form - dem Viewer (oder Bildbetrachter) selbst. Hierbei soll immer der gesamte zur Verfügung stehende Bildschirmbereich abgedeckt werden - Vollbildmodus ist angesagt. Die Bilder selbst sollen immer in der Mitte der Form dargestellt werden. Für die manuelle Steuerung des Bildablaufs möchten wir eine kleine "Toolbar-Bar" ganz oben links angezeigt bekommen. Erstellen des Projekts Die Oberfläche
Die Bildsymbole der Toolbar werden in einem Abbildungslisten-Steuerelement abgelegt (ImageList). Als nächstes fügen wir der ImageList die nachfolgenden Symbole hinzu:
Nebenstehende Abbildung zeigt den Eigenschaften-Dialog des ImageList-Controls, über den die Bildsymbole hinzugefügt werden. Download Bildsymbole: diashow_buttons.zip (2 KB) Das autom. Anzeigen des nächsten Bildes erfolgt zeitgesteuert über ein Timer-Control, (tmrNext) das Sie ebenfalls auf der Form platzieren. Jetzt brauchen wir noch das FileList-Control (File1), sowie ein Image-Control imgPicture) für die Anzeige des Bildes.
Code-Grundgerüst Jetzt geht's ans Eingemachte - ans Proggen Option Explicit ' API-Funktion, um das Fenster in den Vordergrund zu schieben Private Declare Function SetForegroundWindow Lib "USER32" ( _ ByVal hwnd As Long) As Long ' Index des aktuellen Bildes (in der FileListBox) Private PicIndex As Integer ' Die alten Mauskoordinaten Private OldX As Integer, OldY As Integer ' Status-Konstanten Private Enum STATE_CONSTANTS ST_PLAYING = 0 ST_PAUSED = 1 End Enum ' Auswahl-Konstanten (chronologisch oder zufällig) Private Enum CHOOSE_CONSTANTS CHOOSE_NORMAL = 0 CHOOSE_RANDOM = 1 End Enum ' Auswahlmodus Private ChooseMode As CHOOSE_CONSTANTS ' Status Private State As STATE_CONSTANTS ' Wie viele Listeneinträge bisher gezeigt wurden Private SelCount As Integer Beim Laden der Form (also noch bevor diese sichtbar wird) sind erst einmal einige Dinge zu erledigen:
Private Sub Form_Load() ' Breite und Höhe dem Bildschirm anpassen (Vollbild) Me.Move 0, 0, Screen.Width, Screen.Height With tbrMain ' ImageList zuweisen Set .ImageList = ImageList1 ' Toolbar mit Buttons versehen .Buttons.Add , "play", "", 2, "play" .Buttons.Add , "pause", "", 2, "pause" .Buttons.Add , "random", "", 1, "random" .Buttons.Add , "", "", 3 .Buttons.Add , "prev", "", 0, "prev" .Buttons.Add , "next", "", 0, "next" .Buttons.Add , "", "", 3 .Buttons.Add , "browse", "", 0, "browse" .Buttons.Add , "", "", 3 .Buttons.Add , "exit", "", 0, "exit" ' Toolbar mit QuickInfos versehen .Buttons("play").ToolTipText = "Play" .Buttons("pause").ToolTipText = "Pause (P)" .Buttons("random").ToolTipText = "Zufällige Auswahl (RandomPlay)" .Buttons("prev").ToolTipText = "Vorheriges Bild (nach links)" .Buttons("next").ToolTipText = "Nächstes Bild (nach rechts)" .Buttons("browse").ToolTipText = "Durchsuchen... (Strg+O)" .Buttons("exit").ToolTipText = "Verlassen der Diashow (ESC)" ' Toolbar zunächst ausblenden .Visible = False End With ' alle Bilddateien With File1 .Pattern = "*.jpeg;*.jpg;*.gif;*.bmp;*.wmf;*.emf;*.rle;*.ico;*.cur" .Visible = False End With ' Timer-Intervall: 5 Sekunden tmrNext.Enabled = False tmrNext.Interval = 5000 ' Zufallsgenerator initialisieren Randomize -Timer Dim cmd As String ' Aus der Registry auslesen, ob zuletzt ' "Zufällige Wiedergabe" aktiviert war cmd = GetSetting("Martoeng", "Diashow", "ChooseMode", "") If cmd <> "" Then tbrMain.Buttons("random").Value = CLng(cmd) ChooseMode = CLng(cmd) End If ' Commandline auslesen und auf Parameter überprüfen cmd = Command If cmd <> "" Then ' Kommandozeile überprüfen If cmd Like "*/psi*" Or cmd Like "*-psi*" Then ' Keine zweite Instanz der EXE anlegen If App.PrevInstance = True Then Unload Me: Exit Sub End If End If If cmd Like "/i*" Or cmd Like "-i*" Then ' Info ShowInfo If Not Browse Then Browse ElseIf cmd Like "/cmd*" Or cmd Like "-cmd*" Then ' Alle Kommandos ausgeben ShowCommands If Not Browse Then Unload Me: Exit Sub ElseIf cmd Like "*.???" Then ' Dateiliste erstellen On Error GoTo err_Path File1.Path = Trim$(Mid$(cmd, 1, InStrRev(cmd, "\"))) If File1.ListCount > 0 Then If MsgBox("Möchten Sie nur diese Datei ansehen " & _ "(alternativ wird der gesamte Ordner gezeigt)?", _ vbQuestion + vbYesNo, "Datei anzeigen") = vbYes Then File1.Pattern = Trim(Mid(cmd, InStrRev(cmd, "\") + 1)) Else ' gesamter Ordner NextPic tmrNext.Enabled = True End If Else NextPic End If Else On Error GoTo err_Path File1.Path = cmd tmrNext.Enabled = True End If Else ' Bei keinen Optionen If Not Browse Then Unload Me: Exit Sub End If ' Index auf -1, Eigenschaften setzen PicIndex = -1 If tmrNext.Enabled = False Then NextPic If File1.ListCount = 1 Then State = ST_PAUSED tbrMain.Buttons("pause").Value = tbrPressed Else tbrMain.Buttons("play").Value = tbrPressed State = ST_PLAYING tmrNext.Enabled = True End If Me.MousePointer = 99 Exit Sub err_Path: ' Fehler aufgetreten Err.Clear On Error GoTo 0 If MsgBox("Der angegebene Pfad wurde nicht gefunden. " & _ "Möchten Sie jetzt einen Pfad auswählen?", _ vbQuestion + vbYesNo) = vbYes Then If Not Browse Then End Else End End If End Sub Private Sub Form_GotFocus() ' In den Vordergrund SetForegroundWindow Me.hwnd End Sub Private Sub ShowInfo() ' Info über das Programm / den Autor MsgBox "Martin Walter Diashow 2002" & vbCrLf & vbCrLf & _ "Copyright (c) 2002 by Martin Walter. Alle Rechte vorbehalten." & _ "All rights reserved.", vbInformation, "Diashow 2002" End Sub Private Sub ShowCommands() ' mögliche Aufrufparameter anzeigen MsgBox "Diashow 2002 kann mit folgenden Parametern gestartet werden:" & _ vbCrLf & vbCrLf & "/i Programm-Information" & _ vbCrLf & "/cmd Programm-Parameter auflisten" & _ vbCrLf & "/psi Falls d. Programm bereits ausgeführt wird, " & _ "nicht fortfahren", vbInformation, "Diashow 2002" End Sub Ordnerauswahl... Private Function Browse() As Boolean ' Standard-Ordner-Dialog Dim sPath As String tmrNext.Enabled = False sPath = BrowseForFolder("Wählen Sie einen Ordner aus.") If sPath <> "" Then ' Dateiliste aktualisieren File1.Path = sPath If File1.ListCount = 0 Then ' keine Bilddateien gefunden MsgBox "Keine passenden Dateien im Ordner" & vbCrLf & _ Chr(34) & sPath & Chr(34) & vbCrLf & "gefunden.", _ vbExclamation ElseIf File1.ListCount = 1 Then ' exakt 1 Bild vorhanden PicIndex = -1 NextPic Else ' mehr als 1 Bild... PicIndex = -1 NextPic ' Timer starten tmrNext.Enabled = True End If Else If File1.ListCount > 1 Then tmrNext.Enabled = True End If Browse = (sPath <> "") SelCount = 0 End Function Autom. Bildauswahl Sollen die Bilder der Reihe nach angezeigt werden, brauchen wir uns lediglich den Index des aktuellen Bildes zu merken und dann jeweils um eins erhöhen - solange bis alle Bilder an der Reihe waren. Dann geht's von vorne los. Erfolgt die Bildauswahl zufällig, müssen wir uns merken, welche Bilder bereits angezeigt wurden, so dass es nicht vorkommt, dass ein Bild mehrfach angezeigt wird, und andere überhaupt nicht. Auch hier bestätigt uns das FileList-Control, dass wir mit "ihm" die richtige Wahl getroffen haben, denn: das FileList-Control erlaubt es, eine erweiterte Mehrfach-Auswahl einzustellen (MultiSelect = 2), so dass wir über die Selected-Eigenschaft eines jeden einzelnen Eintrags festlegen können, ob ein Bild bereits angezeigt wurde (Selected = True) oder noch nicht (Selected = False). Wichtig! ' Nächstes Bild Private Sub NextPic() ' Überprüfen, ob Dateien vorhanden If File1.ListCount = 0 Then MsgBox "Keine Dateien gefunden.", vbExclamation Unload Me End End If ' Fehlerbehandlung aktivieren On Error GoTo err_NextPic ' Index erhöhen PicIndex = PicIndex + 1 If picIndex > File1.ListCount Then GoTo End_NextPic ' Vorhandenes Bild entfernen Set imgPicture.Picture = Nothing imgPicture.Visible = False imgPicture.Stretch = False ' Auswahlmodus überprüfen If ChooseMode = CHOOSE_NORMAL Then ' nächstes Bild imgPicture.Picture = LoadPicture(IIf(Right(File1.Path, 1) = "\", _ File1.Path, File1.Path & "\") & File1.List(PicIndex)) Else ' zufällige Auswahl... Dim n As Integer PicIndex = PicIndex - 1 If PicIndex <> -1 Then File1.Selected(PicIndex) = True SelCount = SelCount + 1 If SelCount = File1.ListCount Then State = ST_PAUSED For n = 0 To File1.ListCount - 1 File1.Selected(n) = False Next n Else Randomize Do n = Int(Rnd * File1.ListCount) Loop While File1.Selected(n) = True PicIndex = n imgPicture.Picture = LoadPicture(IIf(Right(File1.Path, 1) = "\", _ File1.Path, File1.Path & "\") & File1.List(PicIndex)) End If End If ' Falls über den Bildschirmrand hinaus, das Bild anpassen With imgPicture If (.Width > Me.ScaleWidth) Or (.Height > Me.ScaleHeight) Then .Stretch = True Dim ratio As Double ' Verhältnis berechnen ratio = .Width / .Height If .Width > Me.ScaleWidth Then .Width = Me.ScaleWidth .Height = .Height / ratio End If If .Height > Me.ScaleHeight Then .Height = Me.ScaleHeight .Width = .Height * ratio End If .Left = Me.ScaleWidth / 2 - .Width / 2 .Top = Me.ScaleHeight / 2 - .Height / 2 Else .Left = Me.ScaleWidth / 2 - .Width / 2 .Top = Me.ScaleHeight / 2 - .Height / 2 End If ' Wieder einblenden .Visible = True End With End_NextPic: If PicIndex > File1.ListCount Then PicIndex = -1 Exit Sub err_NextPic: MsgBox Err.Description & vbCrLf & vbCrLf & _ "Aktuelles Bild: " & File1.List(PicIndex), _ vbExclamation, "Fehler Nr. " & Err.Number End Sub Die Prozedur NextPic ermittelt nicht nur das nächste Bild, sondern zeigt dieses auch gleich an. Sollte das Bild größer als die Form sein, wird dieses automatisch an die Form angepasst. Hierzu muss das Seitenverhältnis berechnet werden. Das Bild ist bspw. 800 x 600 Pixel groß, während der Bildschirm nur 640 x 480 Pixel hat. Das Verhältnis ist 4:3 (1,3333333). Somit wird die Breite des Bildes auf die Bildschirmbreite reduziert und die Höhe der neuen Breite angepasst: Höhe = Breite / Verhältnis (Höhe = 640 / 1,3333). Die Stretch-Eigenschaft muss dann natürlich wieder True gesetzt werden. Unsere Toolbar oben links auf der Form verfügt u. a. über ein Symbol zum Anzeigen des vorherigen Bildes. Hierzu verringern wir den aktuellen Bildindex einfach um den Wert 2 und rufen anschließend wieder NextPic auf. ' Vorheriges Bild Private Sub PrevPic() ' Den Index auf Index - 2 setzen, dann NextPic aufrufen If PicIndex > 0 Then PicIndex = PicIndex - 2 Else PicIndex = File1.ListCount - 2 End If NextPic End Sub Manuelle Steuerung des Bildablaufs Die kleine Toolbar oben links soll nur angezeigt werden, wenn der Mauszeiger bewegt wird, andernfalls bleibt sie ausgeblendet. Private Sub Form_MouseMove(Button As Integer, Shift As Integer, _ x As Single, y As Single) ' Bei größerer Mausbewegung Toolbar einblenden If (Abs(OldX - x) > 100 Or Abs(OldY - y) > 100) And _ Not (OldX = 0 And OldY = 0) Then tmrNext.Enabled = False tbrMain.Visible = True tmrNext.Enabled = True Me.MousePointer = 0 End If OldX = x OldY = y End Sub Ist die Toolbar ausgeblendet, soll auch kein Mauszeiger sichtbar sein. Hierzu bedienen wir uns eines ganz einfachen Tricks. Wir setzen die Form-Eigenschaft MouseIcon auf eine leere Cursor-Datei. Wenn wir nun zusätzlich noch MousePointer = 99 einstellen, verschwindet der Mauszeiger Download Mauszeiger: nocursor.zip (1 KB) Funktionen der Toolbar: Private Sub tbrMain_ButtonClick( _ ByVal Button As MSComctlLib.Button) Select Case Button.Key Case "play" ' Diashow abspielen If SelCount = File1.ListCount Then For SelCount = 0 To File1.ListCount - 1 File1.Selected(SelCount) = False Next SelCount SelCount = 0 End If State = ST_PLAYING Case "pause" ' Pause State = ST_PAUSED Case "random" ' Zufällige Bildauswahl ein/aus If Button.Value = tbrPressed Then ChooseMode = CHOOSE_RANDOM Else ChooseMode = CHOOSE_NORMAL End If Case "prev" ' Voriges Bild PrevPic Case "next" ' Nächstes Bild NextPic Case "browse" ' Ordner auswählen tbrMain.Buttons("pause").Value = tbrPressed State = ST_PAUSED Browse Case "exit" ' Beenden Set imgPicture.Picture = Nothing Unload Me End Select End Sub Ist die Toolbar ausgeblendet, soll es möglich sein, die Steuerung auch per Tastatur vornehmen zu können: Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case vbKeyEscape ' Beenden Unload Me Case vbKeyRight ' Nächstes Bild tmrNext.Enabled = False NextPic tmrNext.Enabled = True Case vbKeyLeft ' Vorheriges Bild tmrNext.Enabled = False PrevPic tmrNext.Enabled = True Case vbKeyR ' Zufällige Wiedergabe ein/aus ChooseMode = CHOOSE_RANDOM tbrMain.Buttons("random").Value = tbrPressed Case vbKeyP, vbKeySpace ' Start-/Stop-Taste If State = ST_PAUSED Then tbrMain.Buttons("play").Value = tbrPressed State = ST_PLAYING Else tbrMain.Buttons("pause").Value = tbrPressed State = ST_PAUSED End If Case vbKeyO ' Ordnerauswahl If Shift = vbCtrlMask Then tbrMain.Buttons("pause").Value = tbrPressed State = ST_PAUSED Browse End If End Select End Sub Fehlt jetzt nur noch das autom. Weiterschalten zum nächsten Bild: ' Timer-Prozedur, für Auswahl des nächsten Bildes Private Sub tmrNext_Timer() If tbrMain.Visible Then tbrMain.Visible = False Me.MousePointer = 99 End If If State = ST_PLAYING Then NextPic End If End Sub Erweiterungen des DiaShow-Projekts Natürlich ist die DiaShow hier noch nicht fertig. Sie kann beliebig verändert und verbessert werden. So könnte man z.B. noch die Unterordner des ausgewählten Ordnersmit einbeziehen. Auch die Definition des Timer-Intervalls und andere Kleinigkeiten könnten dem Benutzer in einem Art "Einstellungs-Fenster" zugänglich gemacht werden. Eine gute Erweiterung für das Programm ist die Integration in den Windows-Explorer. Unter dem Schlüssel "HKEY_CLASSES_ROOT\Folder\shell" muss nur ein neuer Schlüssel namens "Diashow starten" eingefügt werden. Darunter der Schlüssel "command". Der Standardwert muss den Pfad des Programms und dahinter "Diashow.exe" enthalten, anschließend "%1". So ergäbe sich bei der Installation ins Verzeichnis "Programme\DiaShow" folgender Wert: C:\Programme\DiaShow\DiaShow.exe %1 Dies könnte man auch autom. vom Programm erledigen lassen. Siehe hierzu: Dieser Workshop wurde bereits 17.821 mal aufgerufen.
Anzeige
Diesen und auch alle anderen Workshops finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
Neu! sevEingabe 3.0 Einfach stark! Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Tipp des Monats Januar 2025 Dieter Otter Zeilen einer MultiLine-TextBox ermitteln (VB.NET) Dieser Zipp zeigt, wie man die Zeilen einer MultiLine-TextBox exakt so ermitteln kann, wie diese auch in der TextBox dargestellt werden. 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 |
||||||||||||||||||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |