CHARGER UN GIF/JPG DANS UNE SURFACE

Dans cet article, nous couvrirons les bases du chargement d'une image gif/jpg dans une surface.

Vous pouvez télécharger le projet exemple de cet article: Code Source Du Projet : ddgifjpg.zip

DirectX et les Gif/Jpg

Il est bien vrai que les bitmaps sont souvent un peu lourds, c'est pourquoi la plus part des programmeurs préfèrent utiliser les images gif ou jpg, Mais DirectX ne dispose d'aucune fonction permettant de le faire. Nous allons donc voir comment procéder.

Déclarations des Fonctions APIs et Constante

Vous avez le choix entre ajouter la référence "Win32 Type Librairy" à votre projet ou déclarer un ensemble de fonctions API.

Ajouter la Librairie

Vous n'aurez plus ainsi besoin de déclarer les APIs et constantes utilisées par la procédure de chargement de gif/jpg.

Déclarer Manuellement les Fonctions APIs

Vous déclarez les fonctions APIs et les constantes par la méthode traditionnelle avant de les utiliser. C'est préférable pour un projet aussi minuscule que le notre.

'APIs POUR CHARGER UN GIF/JPG
Public Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Public Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As Any) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc 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 nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long

'Constantes pour charger un Gif/Jpg
'Copie la source vers la destination
Private Const SRCCOPY = &HCC0020

Passons à la fonction elle-même.

Fonction CreateSurfaceFromFile

CreateSurfaceFromFile est la fonction qui va charger le gif/jpg dans la surface.

Public Function CreateSurfaceFromFile(DirectDraw As DirectDraw7, ByVal FileName As String, SurfaceDesc As DDSURFACEDESC2) As DirectDrawSurface7
    Dim Picture As StdPicture
    Dim Width As Long
    Dim Height As Long
    Dim Surface As DirectDrawSurface7
    Dim hdcPicture As Long
    Dim hdcSurface As Long
   
    'On Charge l'image
    Set Picture = LoadPicture(FileName)
    'On convertit les dimensions
    'de vbHimetric vers vbPixel
    Width = CLng((Picture.Width * 0.001) * 567 / Screen.TwipsPerPixelX)
    Height = CLng((Picture.Height * 0.001) * 567 / Screen.TwipsPerPixelY)
      
    'On définit les propriété de la description
    With SurfaceDesc
        If .lFlags = 0 Then .lFlags = DDSD_CAPS
        .lFlags = .lFlags Or DDSD_WIDTH Or DDSD_HEIGHT
        If .ddscaps.lCaps = 0 Then .ddscaps.lCaps = DDSCAPS_OFFSCREENPLAIN
        If .lWidth = 0 Then .lWidth = Width
        If .lHeight = 0 Then .lHeight = Height
    End With
    
    'On crée la surface DirectDraw
    Set Surface = DirectDraw.CreateSurface(SurfaceDesc)

    'On crée de la Mémoire (pour charger l'image)
    hdcPicture = CreateCompatibleDC(0)

    'On sélectionne le Picture et on le copie
    'vers la mémoire crée
    SelectObject hdcPicture, Picture.Handle
     
    'Handle de la surface
    hdcSurface = Surface.GetDC
      
    'On copie l'image contenue dans hdcSurface vers la surface
    StretchBlt hdcSurface, 0, 0, SurfaceDesc.lWidth, SurfaceDesc.lHeight, hdcPicture, 0, 0, Width, Height, SRCCOPY
   'On libère l'espace mémoire contenue dans hdcSurface
    Surface.ReleaseDC hdcSurface
    DeleteDC hdcPicture
   
    'On transfère la Surface
    Set CreateSurfaceFromFile = Surface
   
    'On vide Tout !
    Set Picture = Nothing
    Set Surface = Nothing
End Function

Il ne reste plus qu'à appeler la fonction.

Dim Surface As DirectDrawSurface7
Dim ddsd As DDSURFACEDESC2
Set Surface = CreateSurfaceFromFile(DD, "C:\image.gif", ddsd)

Je crois que c'est tout!

Conclusion

Bien vous venez de découvrir comment charger une image gif/jpg dans une surface DirectDraw7. Vous pouvez faire de même avec un bitmap.
A Noter que c'est une fonction de Patrice Scribe [Vba51].
On ne peut malheureusement pas charger des gif animés. Mais nous allons voir dans le prochain article comme réaliser des animations à l'aide des fonctions inclues dans DirectX7.

Téléchargement

Vous pouvez télécharger le projet exemple de cet article:

Ce projet affiche une image gif sur l'écran en mode fenêtré.

[Home] lienie.gif (941 octets)[Actualités]  [Trucs & Astuces] [Astuces Windows] [ActiveX-Ocx/Dll] [Articles] [Codes Sources] [VB Games] [Fichiers Sons] [Fichiers Icônes] [Programmes & Sources]  mailing.gif (910 octets)[Mailing-List] smiley.gif (359 octets)[Divers] about.gif (920 octets)[A Propos]