Cette visioneuse a été réalisée dans le but de présenter quatre objets OCX: DriveListBox, DirListBox, FileListBox et PictureBox.
Programmation > Visual Basic
Recherche :   
Actualité Système Salon Concours Outils Programmation Devparadise Programmation HTML .Net JavaScript VBScript ASP PHP Visual Basic Perl Java Active X SQL XML WAP Delphi Graphisme Flash Web Design Promotion Référencement Publicité Valeur de votre site Outils Systèmes Windows Unix Linux Benchmark Hardware Réseaux locaux Droit Sécurité
Visioneuse d'image en Visual Basic
  Auteur : Eric PETIT

Cette visioneuse a été réalisée dans le but de présenter quatre objets OCX: DriveListBox, DirListBox, FileListBox et PictureBox.

Publicité 
Les objets:
   DriveListBox liste les unités de disques disponibles
   DirListBox permet le parcourt des répertoires
   FileListBox affiche tous les fichiers d'un répertoire
   PictureBox permet l'affichage d'une image

Pour cette exemple, nous avons créé un nouveau projet contenant une feuille et un module.

La feuille:
Insérez dans cette feuille un objet DriveListBox (nommé Lecteur), un DirListBox (Répertoire), un FileListBox (Fichier) et deux PictureBox.(VisioImg et VisioImgHid).

Les événements:

Au chargement de la feuille:
Private Sub Form_Load()
   ' Initialisation du lecteur par défaut
   Me.Lecteur.Drive = "c:\"

   ' Définition des formats d'images acceptés
   Me.Fichier.Pattern = "*.jpg;*.jpeg;*.gif;*.wmf;*.bmp"

   ' Définition des propriétés de l'objet VisioImg
   ' L'objet se redessine automatiquement,
   ' mais sa taille ne s'adapte pas automatiquement à l'image,
   ' les dimension sont données en pixel
   Me.VisioImg.AutoRedraw = True
   Me.VisioImg.AutoSize = False
   Me.VisioImg.ScaleMode = 3
   ' Définition des propriétés de l'objet VisioImgHid
   ' L'objet se redessine automatiquement,
   ' mais sa taille s'adapte automatiquement à l'image,
   ' l'objet n'est pas visible
   ' les dimension sont données en pixel
   Me.VisioImgHid.AutoRedraw = True
   Me.VisioImgHid.AutoSize = True
   Me.VisioImgHid.Visible = False
   Me.VisioImgHid.ScaleMode = 3

   ' Mémorisation des dimension d'origine dans des variables globales
   OnStartWidth = Me.VisioImg.ScaleWidth
   OnStartHeight = Me.VisioImg.ScaleHeight

   ' StatusB est une barre de status (label) utilisée pour diffuser des commentaires
   Me.StatusB.ForeColor = &H0&
   Me.StatusB.Caption = " Choisissez une image."
End Sub

Lors d'un changement de lecteur:
Private Sub Lecteur_Change()
   Dim OldPath As String
   Dim NouvLecteur As String

   ' En cas d'erreur de lecture, se rendre au label ErrLect
   On Error GoTo ErrLect
   OldPath = Me.Repertoire.Path
   NouvLecteur = Me.Lecteur.Drive

   ' Modification du chemin de parcours du répertoire
   Me.Repertoire.Path = NouvLecteur
   Me.Repertoire.Refresh
   ' Sorie de la routine
   Exit Sub
ErrLect:
   ' Il y a eu une erreur, récupération de l'nacien chemin et de l'ancien lecteur
   ' Affichage de l'erreur
   Me.Lecteur.Drive = Left(OldPath, 2)
   Me.Repertoire.Path = OldPath
   MsgBox "Le lecteur " & NouvLecteur & " n'est pas prêt !", vbOKOnly, "Erreur"
End Sub

Lors d'un changemant de répertoire:
Private Sub Repertoire_Change()
   ' Modification du chemin de listage des fichiers
   Me.Fichier.Path = Me.Repertoire.Path
   Me.Fichier.Refresh
End Sub

Lors du choix d'un fichier:
Private Sub Fichier_Click()
   ' Modification des commentaires et du pointer de souris
   Me.StatusB.ForeColor = &H0&
   Me.StatusB.Caption = " Chargemant en cours...       Récupération du chemin du fichier."
   Me.MousePointer = 11

   ' Masque l'image le temps du traitemant
   Me.VisioImg.Visible = False
   ' Récupération du chemin et du nom du fichier
   ImgSrc = Dir_AddSep(Me.Fichier.Path) & Me.Fichier.filename
   
   Me.StatusB.Caption = " Chargemant en cours...       " & ImgSrc
   DoEvents
   ' Mise à zerro de l'image principale et chargement de l'image secondaire
   Me.VisioImg.Picture = LoadPicture()
   Me.VisioImgHid.Picture = LoadPicture(ImgSrc)
   DoEvents

   ' Copie l'image secondaire vers l'image principale avec mise à l'échelle
   If CopieImage(Me.VisioImg, Me.VisioImgHid, OnStartHeight, OnStartWidth) Then
      ' La copie à réussie, affichage de l'image
      Me.VisioImg.Visible = True
      Me.StatusB.Caption = " Choisissez une nouvelle image.       Image courante : " & ImgSrc
   Else
      ' La copie à échouée, affichage de l'erreur
      Me.StatusB.ForeColor = &HFF&
      Me.StatusB.Caption = " Erreur lors de l'affichage de l'image !       Choisissez une autre image."
   End If
   DoEvents

   ' Initialisation de l'image secondaire, affichage du pointeur par défault
   Me.VisioImgHid.Picture = LoadPicture()
   Me.MousePointer = 0
   DoEvents
End Sub

Le module:

' Déclaration des API nécessaires au traitemant de l'image
Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hdc As Long) As Long
Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

' Déclaration des constantes
Global Const gstrSEP_DIR$ = "\"                   ' Séparateur de dossier
Public Const gstrSEP_URL$ = "://"                ' Séparateur qui suit HPPT dans les adresses URL
Public Const gstrSEP_URLDIR$ = "/"                ' Séparateur séparant les dossiers dans les adresses URL.
Public Const SRCCOPY = &HCC0020

' Déclaration des variables globales
Global OnStartWidth As Long
Global OnStartHeight As Long
Global ImgSrc As String

Function CopieImage(CtrlDest As Object, CtrlSrc As Object, MaxHeight As Long, MaxWidth As Long) As Boolean
   ' Fonction de copie de l'image avec mise à l'échelle
   Dim SrcHeight As Long
   Dim SrcWidth As Long
   Dim DestHeight As Long
   Dim DestWidth As Long
   Dim I As Long
   Dim J As Long
   Dim CopieStep As Double
   Dim XRDC As Long
   Dim XBB As Long

   CopieImage = True
   ' En cas d'erreur se rendre au label ErrCopieImage
   On Error GoTo ErrCopieImage
      ' récupération des dimension de l'image secondaire
      SrcHeight = CtrlSrc.ScaleHeight
      SrcWidth = CtrlSrc.ScaleWidth

      If (SrcWidth > MaxWidth) Then
         ' Si la largeur est trop grande pour la taille de la fenêtre
         ' On fixe de nouvelles dimensions à l'image
         DestHeight = CLng(MaxWidth * SrcHeight / SrcWidth)
         DestWidth = MaxWidth

         If (DestHeight > MaxHeight) Then
            ' Si après modifcation, la hauteur est trop grande
            ' On fixe de nouvelles dimensions à l'image
            DestWidth = CLng(MaxHeight * SrcWidth / SrcHeight)
            DestHeight = MaxHeight
         End If
      ElseIf (SrcHeight > MaxHeight) Then
         ' Si la largeur est correcte, mais pas la hauteur
         ' On fixe de nouvelles dimensions à l'image
         DestWidth = CLng(MaxHeight * SrcWidth / SrcHeight)
         DestHeight = MaxHeight
      Else
         ' Sinon, on concerve la taille d'origine de l'image
         DestHeight = SrcHeight
         DestWidth = SrcWidth
      End If

      ' Redimentionnement de l'image principale
      CtrlDest.ScaleHeight = DestHeight
      CtrlDest.ScaleWidth = DestWidth

      ' Détermine le pas pour la mise à l'échelle
      CopieStep = SrcWidth / DestWidth

      ' Pour chaque ligne de l'image principale
      For I = 0 To DestHeight
         ' Pour chaque colonne de chaque ligne de l'image principale
         '    soit chaque pixel de l'image principale
         For J = 0 To DestWidth
            ' Copier dans l'image principale à la position (J;I), un pixel
            ' à partir du pixel à la position (J x CopieStep;I x CopieStep), de l'image secondaire
            XBB = BitBlt(CtrlDest.hdc, J, I, 1, 1, CtrlSrc.hdc, CLng(J * CopieStep), CLng(I * CopieStep), SRCCOPY)
         Next J
      Next I
      XRDC = ReleaseDC(CtrlSrc.hWnd, CtrlDest.hdc)
      CtrlDest.Refresh
      
   On Error GoTo 0
   Exit Function
ErrCopieImage:
   ' La copie à échouée
   CopieImage = False
End Function

Function Dir_AddSep(ByVal strPathName As String) As String
' Ajoute un séparateur de chemin de dossier (barre oblique inverse) à la fin de la ligne, sauf s'il y en a déjà un.

   If Right(Trim(strPathName), Len(gstrSEP_URLDIR)) <> gstrSEP_URLDIR And _
      Right(Trim(strPathName), Len(gstrSEP_DIR)) <> gstrSEP_DIR Then
      Dir_AddSep = RTrim$(strPathName) & gstrSEP_DIR
   Else
    Dir_AddSep = strPathName
   End If
End Function

Télécharger le source

A lire aussi sur Devparadise.com :
  • ASP et la création d'images à la volée
  • Lecture de la ligne de commande en Visual Basic.
  • Génération de fichiers PDF à la volée.
  • Service NT en Visual Basic
  • Récupération de documents sur un serveur internet
  • A télécharger aussi sur Devparadise.com :
  • Contrôleur d'attributs (Source VB)
  • Visioneuse d'image en Visual Basic
  • ServiceMill Control
  • Slice and Dice 1.8.194
  • Flash Objects 0.9

  • © 1997-2005 tous droits réservés Devparadise.com
    Les logos, et marques déposées sont la propriété de leurs détenteurs respectifs.
    Devparadise.com s'est engagé à respecter la confidentialité des données personnelles régies par la loi 78-17 du 6 janvier 1978.
    Déclaration C.N.I.L. n° 621623
    VB,Visual Basic,OCX,DriveListBox,DirListBox,FileListBox,PictureBox