Loadimage via l'api

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 038 fois - Téléchargée 38 fois

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

Ajouter un commentaire

Commentaires

Messages postés
5
Date d'inscription
mardi 28 janvier 2003
Statut
Membre
Dernière intervention
26 février 2003

>> Gally >>

Merci

Je ne parvenais plus à mettre la main sur cette fonction.
Messages postés
386
Date d'inscription
samedi 4 octobre 2008
Statut
Membre
Dernière intervention
19 février 2018
2
Bonjour,

juste une petite betise avec les lignes

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

La multiplication par 15 est valide mais cela peu changer en fonction des Tailles d'écran. il serait donc plus simple d'ecrire:

Me.Width = bmp.bmWidth * Screen.TwipsPerPixelX
Me.Height = bmp.bmHeight * Screen.TwipsPerPixelY

Cela permet d'eviter le erreur de convertion.

Voila A++
[Gally Home Corp]
Messages postés
530
Date d'inscription
lundi 3 juin 2002
Statut
Membre
Dernière intervention
13 juin 2004

j'en profiterais pour faire un tuto, flipper pas comme ca !
Messages postés
530
Date d'inscription
lundi 3 juin 2002
Statut
Membre
Dernière intervention
13 juin 2004

createwindow est une fonction interessante, mais dejà difficile a manipuler, fodrait ke je m'y mette un jour
Messages postés
259
Date d'inscription
dimanche 14 juillet 2002
Statut
Membre
Dernière intervention
17 août 2012

sa lair interessant mais il maque de commantaire..jenre moi sa rapetise liamge dans el ocin ééééé.... alors sé pas terible lidé....et il charge quel iamge en mémoire.....entuqua svp expliqe se qui faut faire pour que sa donne de quoi

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.