Loadimage via l'api

Contenu du snippet

On fait-on pour afficher une Bitmap dans une fenêtre créée à partir de l'api win32 (createWindow, CreateWindowEx)?

On fait appel à la fonction LoadImage !

dans cet exemple, l'image est directement affichée dans une form standard.

Dans le cas où vous utiliseriez CreateWindow, placez donc ce code dans votre fonction Callback > message WM_PAINT (en n'oubliant pas d'utiliser le paramètre hWnd et non Me.hWnd de la form).

Source / Exemple :


dans un module :
--------------------

Option Explicit

Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Public Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Public Declare Function LoadImage Lib "user32" Alias "LoadImageA" (ByVal hInstance As Long, ByVal lpszName As String, ByVal uType As Long, ByVal cxDesired As Long, ByVal cyDesired As Long, ByVal fuLoad As Long) As Long
Public Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Public 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
Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

Public Const IMAGE_BITMAP = 0
Public Const LR_LOADFROMFILE = &H10
Public Const SRCCOPY = &HCC0020

Public Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type

Public Type BITMAP '14 bytes
        bmType As Long
        bmWidth As Long
        bmHeight As Long
        bmWidthBytes As Long
        bmPlanes As Integer
        bmBitsPixel As Integer
        bmBits As Long
End Type

dans une Form :
-------------------

Option Explicit

Private hBitmap As Long

Private Sub Form_Paint()
    Dim bmp As BITMAP
    Dim hdc, hDCmemory As Long
    
    ' 1. on récupère le handle du contexte de périphérique (Device Context)
    ' de l'objet dans lequels on souhaite afficher l'image
    hdc = GetDC(Me.hwnd)
    
    ' 2. on charge l'image et on stocke son handle
    hBitmap = LoadImage(ByVal 0&, App.Path & "\monImage.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)
    
    ' 3. on crée un contexte de périphérique, celui-ci sera utilisé pour charger l'image en mémoire
    hDCmemory = CreateCompatibleDC(0)
    
    ' 4. on charge l'image en mémoire
    Call SelectObject(hDCmemory, hBitmap)
    
    ' 5. on récupère les données du bitmap que l'on stocke dans une structure de type BITMAP (voir module)
    Call GetObject(hBitmap, Len(bmp), bmp)
    
    ' 6. on affiche l'image dans le DC souhaité à partir de celui chargé en mémoire
    Call BitBlt(hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, hDCmemory, 0, 0, SRCCOPY)
    
    ' 7. on libère le DC de notre object
    Call ReleaseDC(Me.hwnd, hdc)

    Me.Width = bmp.bmWidth * 15
    Me.Height = bmp.bmHeight * 15
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    ' Et surtout, on n'oublie pas de supprimer les objects créés
    Call DeleteObject(hBitmap)
End Sub

Conclusion :


Dans cet exemple, 2 fichiers:

- un module > avec les déclarations de fonctions et de structures da l'api Win32
- une Form sans object

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.