Viewdoc veille sur les articles

Description

Ca sert toujours à visionner des dossiers qui contiennent un texte et des captures.
Cette nouvelle version de ViewDoc Affiche toutes les images compatibles avec la picture box. (Menu contextuel de réglage très pauvre, mais j'ai d'autres impératifs).
Le sous-programme de capture fonctionne, mais je vois pas comment l'intègrer dans l'interface.

Source / Exemple :


'..........FICHIER FORM1 .........................

Public Class Form1

    Friend Main As FolderDoc

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Text = "ViewDoc"
        SetBounds(Location.X, Location.Y, 300, 250)
        Main = New FolderDoc
        Main.Skin()
        Controls.Add(Main)
    End Sub

 End Class

'.............FICHIER MODULE...............................
Imports Shell32 'composant COM Microsoft Shell Controls And Automation

Module ViewDoc

#Region "La liste, le texte et l'image. Des Instances adaptées aux éventualités."

    'I. Zone du texte  
    Dim Editeur As New TextOs
    'II. Zone de l'image 
    Dim Dessin As New PictOs
    'III. Liste des fichiers   "
    Dim Liste As New ListOs

#End Region

    ''' <summary> Sous programmes de ViewDoc. </summary>
    Public Class FolderDoc 'ViewDoc 2009
        Inherits UserControl

        'IV. Selection du Dossier   "
        Friend WithEvents Selecteur As New ArbrOs

        'V Section technique

#Region "           'Espace d'affichage."
        Dim Sp1 As New SplitContainer
        Dim Sp2 As New SplitContainer
        Dim Sp3 As New SplitContainer

        ''' <summary>Affichage des éléments principaux</summary>
        Friend Sub SkinHead()
            Selecteur.Tronc.Dock = DockStyle.Fill
            Sp2.Panel2.Controls.Add(Editeur.Livre)
            'Sp2.Panel2.ContextMenuStrip = Livre.ContextMenuStrip
            Dessin.Toile.Dock = DockStyle.Fill
            Dessin.Toile.SizeMode = PictureBoxSizeMode.StretchImage
            Sp1.Panel1.Controls.Add(Selecteur.Tronc)
            Editeur.Livre.Dock = DockStyle.Fill
            Sp1.Panel2.Controls.Add(Dessin.Toile)
            Liste.Suite.Dock = DockStyle.Fill
            Sp3.Panel2.Controls.Add(Liste.Suite)
        End Sub

        ''' <summary>
        ''' On place des double panneaux dans chaque demi-panneau
        ''' pour diviser la fenêtre en Quatre zones d'affichage,
        ''' Il reste Sp1, Sp2 et Sp3.panel2</summary>
        Friend Sub Skin() 'Disposition Générale
            'Le UserControl prend toute la place
            Dock = DockStyle.Fill
            'On divise chacun d'eux comme on préfère
            Sp1.Orientation = Orientation.Vertical
            Sp2.Orientation = Orientation.Horizontal
            Sp3.Orientation = Orientation.Vertical
            'On fixe les Proportions initiales. 
            SetBounds(0, 0, 300, 250)
            Sp3.SetBounds(3, 3, 295, 244)
            Sp1.SplitterDistance = 130
            Sp2.SplitterDistance = 180
            Sp3.SplitterDistance = 220
            'Et les positions relatives.
            Sp1.Dock = DockStyle.Fill
            Sp2.Dock = DockStyle.Fill
            Sp3.Anchor = ToutAnchor
            'Sp3.Dock = DockStyle.Fill
            'On met Sp1 dans Sp2 .
            Sp2.Panel1.Controls.Add(Sp1)
            'et Sp2 dans Sp3
            Sp3.Panel1.Controls.Add(Sp2)
            'On inscrit ces paramètres dans une structure de contrôle 
            Controls.Add(Sp3)
            SkinHead() 'et on range les objets dans les demi-Pannaux qui restent
        End Sub
#End Region 'Si j'imbrique trois doubles panneaux il en reste 2 (4 Moitiés)

        Function Chemin() As String
            Return Selecteur.Dos_Path(Selecteur.Noeud)
        End Function

        ''' <summary>Rafraîchissement de l'affichage </summary>
        Private Sub Rafraichit(ByVal T As TreeNode) Handles Selecteur.Rafraichit
            Dim N = Selecteur.Noeud.Text
            Try
                'Editeur.Livre.Text = ""
                Editeur.Livre.LoadFile(Chemin() & N & ".txt", RichTextBoxStreamType.PlainText)
            Catch ex As Exception
                Editeur.Livre.Text = "Pas de " & N & ".txt. Désolé!"
            End Try
            Dessin.Reset(Chemin)
            Liste.Reset(Selecteur.Dos_Path(Selecteur.Noeud))
        End Sub

        'Compresser un Dossier 
        Dim WithEvents Compresse As ToolStripItem
        Friend Sub New()
            Selecteur.Tronc.ContextMenuStrip = New ContextMenuStrip
            Compresse = Selecteur.Tronc.ContextMenuStrip.Items.Add("Compresser")
            Skin()
        End Sub

        Private Sub Compresse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Compresse.Click
            Dim DossierAcompresser As String = Form1.Main.Chemin()
            Dim ZipName As String = DossierAcompresser.Substring(0, DossierAcompresser.Length - 1) & ".zip"
            Dim ZipDialog As New FileDialog(ZipName)
            ZipDialog.AddFiltre(".Zip", "Fichier compressé")
            If ZipDialog.Sauve = DialogResult.OK Then
                ZipName = ZipDialog.Name
                Dim B(21) As Byte
                B(0) = 80 : B(1) = 75 : B(2) = 5 : B(3) = 6
                IO.File.WriteAllBytes(ZipName, B)
                Dim SH As New Shell
                Dim SF As Folder = SH.NameSpace(ZipName)
                Dim DF As Folder = SH.NameSpace(DossierAcompresser)
                SF.CopyHere(DF)
            End If
        End Sub

    End Class

#Region "Classes d'usage général"

    Public Class ListOs
        Friend WithEvents Suite As New ListBox
        Private Sub Suite_SelectedValueChanged(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles Suite.SelectedValueChanged
            Dim Dir As New IO.DirectoryInfo(Form1.Main.Chemin() & "\")
            Dim S As String = ""
            Dim Ok As Boolean = False
            Try
                For Each Rep As IO.FileInfo In Dir.GetFiles()
                    If Rep.Name = Suite.SelectedItem Then
                        Ok = True : S = Rep.FullName
                        MessageBox.Show("Le programme pour ouvrir le fichier " & vbLf _
                        & S & " est : " & ProgAssocie(S))
                        Exit For
                    End If
                Next
            Catch ex As Exception
            End Try
        End Sub

        Friend Sub Reset(Optional ByVal Chemin As String = Nothing)
            Suite.Items.Clear()
            If Chemin = Nothing Then : Else
                Dim Dir As New IO.DirectoryInfo(Chemin & "\")
                Try
                    For Each file As IO.FileInfo In Dir.GetFiles()
                        Suite.Items.Add(file.Name) : Next
                Catch ex As Exception
                End Try
            End If
        End Sub

    End Class

    Friend Class ArbrOs

        Friend WithEvents Tronc As New TreeView
        Friend Noeud As TreeNode 'Variable courante
        Friend Sub New()
            Noeud = New TreeNode
            Tronc.ShowNodeToolTips = True
            Tronc.Nodes.Add(Noeud)
            Tronc.Anchor = ToutAnchor
            'Tronc.Dock = DockStyle.Fill
            Noeud.Text = "Bureau"
            Noeud.ToolTipText = My.Computer.FileSystem.SpecialDirectories.Desktop
            Tronc.ShowNodeToolTips = False
            Dos_Addrive()
            Noeud = Tronc.Nodes.Item(0)
            For Each N As TreeNode In Tronc.Nodes
                If N.Nodes.Count = 0 Then
                    Dos_Add(N)
                End If
            Next
        End Sub
        Friend Event Rafraichit(ByVal N As TreeNode)

        ''' <summary>Ajoute le dos dans la racine</summary>
        Friend Sub Dos_Addrive()
            For Each drive As IO.DriveInfo In My.Computer.FileSystem.Drives
                If drive.IsReady Then
                    Dim Volume As New TreeNode()
                    Dim N As New TreeNode(drive.Name) '.Name.Substring(0, 2))
                    N.ToolTipText = drive.Name.Substring(0, 2)
                    Tronc.Nodes.Add(N) '(drive.Name.Substring(0, 2))
                End If
            Next
        End Sub

        ''' <summary>Ajoute les Dossiers du répertoire</summary>
        ''' <remarks>Les collections TreeNode.Nodes 
        ''' répertorient les répertoires.</remarks>
        Friend Sub Dos_Add(ByVal V As TreeNode)
            Dim S As String = Dos_Path(V) & "\"
            Dim Dir As New IO.DirectoryInfo(S)
            Dim Rep As IO.DirectoryInfo
            Try
                For Each Rep In Dir.GetDirectories()
                    V.Nodes.Add(Rep.Name) : Next
            Catch ex As Exception
            End Try
        End Sub

        ''' <summary>Le FullPath Dos</summary>
        ''' <remarks>Dos est géré comme un arbre
        ''' Dont les racines sont définies par programme</remarks>
        Friend Function Dos_Path(ByVal V As TreeNode) As String
            Dim S As String = ""
            Dim P As TreeNode = V
            Do While Not Tronc.Nodes.Contains(P)
                S = P.Text & "\" & S
                P = P.Parent
            Loop
            Return P.ToolTipText & "\" & S
        End Function

        Private Sub Tronc_BeforeExpand(ByVal sender As Object, ByVal e As TreeViewCancelEventArgs) Handles Tronc.BeforeExpand
            For Each N As TreeNode In e.Node.Nodes : If N.Nodes.Count = 0 Then : Dos_Add(N) : End If : Next
        End Sub

        Private Sub Tronc_AfterSelect(ByVal sender As Object, ByVal e As TreeViewEventArgs) Handles Tronc.AfterSelect
            Noeud = e.Node
            RaiseEvent Rafraichit(e.Node)
        End Sub

    End Class

    ''' <summary> Dialogue de sauvegarde </summary>
    Public Class FileDialog 'Ouvrir ou fermer un fichier
        Dim Lecture As Boolean = True
        Public Directory As String
        Public racine As String = "essai"
        Public Extension As String = ".txt"
        Public Filtre As String = "Tous les fichiers|*.*"

        Public Sub New(Optional ByVal Default_File_Name As String = "")
            If Default_File_Name = "" Then
                Directory = My.Computer.FileSystem.SpecialDirectories.Desktop
            Else : Name = Default_File_Name : End If
        End Sub
        'Ajouter une extension et un commentaire éventuel dans le filtre de selection des fichiers
        Public Sub AddFiltre _
        (ByRef Extension As String, Optional ByRef Description As String = "*")
            If Description = "*" Then Description = "*" & Extension
            Filtre = Description & "|*" & Extension & "|" & Filtre
        End Sub
        'Nom complet (Chemin\nom de fichier.extension)
        Public Property Name() As String
            Get
                Return Directory + "\" + racine + Extension
            End Get
            Set(ByVal File_Name As String)
                Directory = System.IO.Path.GetDirectoryName(File_Name)
                racine = System.IO.Path.GetFileNameWithoutExtension(File_Name)
                Extension = System.IO.Path.GetExtension(File_Name)
            End Set
        End Property

        ''' <summary> Selection du fichier dans l'explorateur </summary>
        ''' <remarks> Using D As New Dialog: D.Charge: Dim Fichier As String = D.Name : End Using </remarks>
        Public Function Charge() As DialogResult
            Dim Ok As DialogResult
            Using Ofd As New OpenFileDialog
                Ofd.Filter = Filtre
                Ofd.InitialDirectory = Directory
                Ok = Ofd.ShowDialog()
                If Ok = DialogResult.OK Then
                    Name = Ofd.FileName : End If
            End Using
            Return Ok
        End Function
        Public Function Sauve() As DialogResult
            Dim Ok As DialogResult
            Using Sfd As New SaveFileDialog
                Sfd.Filter = Filtre
                Sfd.FileName = racine
                Sfd.InitialDirectory = Directory
                Ok = Sfd.ShowDialog()
                If Ok = DialogResult.OK Then
                    Name = Sfd.FileName : End If
            End Using
            Return Ok
        End Function 'Using D As New Dialog: D.Sauve: Dim Fichier As String = D.Name : End Using 

    End Class

    Public Class PictOs
        'La classe Pictos gère les modalités de rafraîchissement automatique du système graphique de paint-brush.

        'Friend Pasdimage As Boolean = False
        Friend WithEvents Toile As PictureBox
        Friend WithEvents Diaporama As New Pictos_Diaporama

        Friend Sub New()
            Toile = New PictureBox
            Toile.ContextMenuStrip = New ContextMenuStrip
            Diaporama.Parametres = Toile.ContextMenuStrip.Items.Add("Diaporama")
        End Sub

        Private Sub Repeint(ByVal g As Graphics)
            g.Clear(Color.Aqua)
            Dim S As String = Form1.Main.Selecteur.Noeud.Text
            If S = "" Then S = "Fichier"
            Dim L As Integer = Toile.Size.Width / (S.Length)
            Dim u As Integer = 0
            Dim H As Integer = Toile.Size.Height / 4
            If Toile.Size.Height > L * 4 Then H = L : u = 1
            Dim f As New Font("tahoma", H, FontStyle.Bold)
            g.DrawString("Pas de", f, Brushes.YellowGreen, 0, H * u)
            g.DrawString(S, f, Brushes.YellowGreen, 0, H * (u + 1))
        End Sub

        'Peindre le graphics.
        Friend Sub Toile_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Toile.Paint
            If Diaporama.Liste.Count < 1 Then Repeint(e.Graphics)
        End Sub

        Friend Sub Image_Suivante() Handles Diaporama.ImageSuivante
            If Diaporama.Image.Equals(Nothing) Then  Else Toile.Image = Diaporama.Image
        End Sub

        Friend Sub Reset(ByVal Chemin As String)
            Diaporama.Url_Images = Chemin
            Diaporama.Liste = Diaporama.Directory_Images(Chemin)
            Diaporama.Indice_Diapo = 0
            Toile.Refresh()
        End Sub

    End Class

    Friend Class Pictos_Diaporama 'Diaporama des images d'un répertoire
        'La classe Pictos gère l'affichage des fichiers d'images sur le disque. 

        Friend WithEvents Diaporama As New Timer
        Friend WithEvents Parametres As ToolStripItem
        Friend Url_Images As String = Nothing
        Friend Indice_Diapo As Integer = 0
        Friend Tempo As Integer = 500
        Friend DiaporamaSelected As Boolean = True
        Friend Image As System.Drawing.Image
        Friend Event ImageSuivante()
        Dim WithEvents Fiche As Fiche_Diaporama
        Friend Pasdimage As Boolean = True
        Friend Liste As List(Of System.Drawing.Image)

        Private Class Fiche_Diaporama
            Dim WithEvents Pupitre As New Form
            Friend Diaporun As New CheckBox
            Dim Textinterval As New Label
            Friend DiapoIntervalle As New NumericUpDown
            Event Closing()
            Private Sub Skin()
                Diaporun.Text = "Diaporama" : Diaporun.CheckAlign = ContentAlignment.MiddleRight
                Pupitre.SetBounds(Form1.Location.X + 100, Form1.Location.Y + 100, 200, 200)
                Textinterval.SetBounds(0, 25, 300, 20)
                DiapoIntervalle.SetBounds(0, 50, 100, 20)
                Pupitre.Controls.Add(Diaporun)
                Pupitre.Controls.Add(Textinterval)
                Pupitre.Controls.Add(DiapoIntervalle)
            End Sub
            Friend Sub New()
                Textinterval.Text = "Vitesse en 1/10èmes de Seconde"
                Skin()
                Pupitre.Show()
            End Sub
            Friend Sub Form_Closing() Handles Pupitre.FormClosing
                RaiseEvent Closing()
            End Sub
        End Class

        Private Sub Parametres_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Parametres.Click
            Fiche = New Fiche_Diaporama
            Fiche.DiapoIntervalle.Value = Tempo / 100  ' 10eme de seconde = 100 millisecondes
            Fiche.Diaporun.Checked = DiaporamaSelected
        End Sub
        Friend Sub Fiche_Closing() Handles Fiche.Closing
            DiaporamaSelected = Fiche.Diaporun.Checked
            Tempo = Fiche.DiapoIntervalle.Value * 100
            Diaporama.Interval = Tempo
            If DiaporamaSelected Then Diaporama.Start() Else Diaporama.Stop()
        End Sub

        ''' <summary> Liste des fichiers d'image du répertoire </summary> <param name="Path_Dossier"></param>
        Friend Function Directory_Images(ByVal Path_Dossier As String) As List(Of System.Drawing.Image)
            Dim Liste As New List(Of System.Drawing.Image)
            'Dim ImageTest As System.Drawing.Image
            For Each Fichier As String In My.Computer.FileSystem.GetFiles(Path_Dossier)
                Try
                    'ImageTest = System.Drawing.Image.FromFile(Fichier)
                    Liste.Add(System.Drawing.Image.FromFile(Fichier))
                Catch ex As Exception
                End Try
            Next
            Return Liste
        End Function

        Friend Sub Tempo_Tick() Handles Diaporama.Tick
            If Liste.Count > 0 Then
                Image = Liste.Item(Indice_Diapo)
                RaiseEvent ImageSuivante()
                Indice_Diapo = Indice_Diapo + 1
                If Indice_Diapo >= Liste.Count Then Indice_Diapo = 0
            Else : Image = Nothing
            End If
        End Sub

        Friend Sub New()
            Diaporama.Interval = Tempo
            Diaporama.Start()
        End Sub
    End Class

    Friend Class TextOs
        Friend Livre As New RichTextBox

        Dim TextOs_Menu As ContextMenuStrip
        'Dim F As New FileDialog

        Dim WithEvents Copie As ToolStripItem
        Dim WithEvents Colle As ToolStripItem
        Dim WithEvents Sauve As ToolStripItem
        Dim WithEvents Charge As ToolStripItem

        Friend Sub New()
            'Copie = New ToolStripItem
            'Livre.ContextMenuStrip = New ContextMenuStrip
            TextOs_Menu = New ContextMenuStrip
            Copie = TextOs_Menu.Items.Add("Copie")
            Colle = TextOs_Menu.Items.Add("Coller")
            Sauve = TextOs_Menu.Items.Add("Sauver")
            Charge = TextOs_Menu.Items.Add("Charger.rtf")
            Livre.ContextMenuStrip = TextOs_Menu
        End Sub

        Private Sub Copie_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Copie.Click
            Livre.Copy()
        End Sub
        Private Sub Colle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Colle.Click
            Livre.Paste()
        End Sub
        Private Sub Sauve_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Sauve.Click
            Dim F As New FileDialog(Form1.Main.Chemin & Form1.Main.Selecteur.Noeud.Text)
            F.AddFiltre(".rtf", "Texte amélioré")
            F.AddFiltre(".txt", "Texte à skis")
            If F.Sauve = DialogResult.OK Then Livre.SaveFile(F.Name)
        End Sub
        Private Sub Charge_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Charge.Click
            Dim F As New FileDialog(Form1.Main.Chemin)
            If F.Charge = DialogResult.OK Then
                If F.Extension = "rtf" Then Livre.LoadFile(F.Name) Else Livre.Text = LoadFile(F.Name)
            End If
        End Sub

    End Class

#Region "Module Util"

    Friend ToutAnchor As AnchorStyles = AnchorStyles.Bottom Or AnchorStyles.Left Or AnchorStyles.Right Or AnchorStyles.Top

    Friend Function LoadFile(ByVal FileName As String) As String
        Dim Flux As New IO.StreamReader(FileName)
        Return Flux.ReadToEnd
    End Function

    Friend Declare Function FindExecutable Lib "Shell32.Dll" _
    Alias "FindExecutableA" (ByVal lpFile As String, _
                             ByVal lpDirectory As String, _
                             ByVal lpResult As String) As Long

    Friend Function ProgAssocie(ByVal File_Name As String) As String
        Dim stFichier As String = System.IO.Path.GetFileName(File_Name)
        Dim stChemin As String = System.IO.Path.GetDirectoryName(File_Name)
        Dim stDossier As String = Space$(250)
        Dim lgDossier As Long = FindExecutable(stFichier, stChemin, stDossier)
        Return stDossier.Substring(0, InStr(1, stDossier, vbNullChar) - 1)
    End Function

#End Region 'End Module

#End Region

End Module

Conclusion :


La prochaine version devrait gérer l'actualisation de l'arbre des dossiers quand on modifie l'arborescence dans une autre tâche. (avec Windows explorer par exemple.), mais pas avant longtemps.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.