Bonjour,

Cela fait quelques jours que je galère ...
Je souhaite utiliser la GDI32 sous vb.net, ce pour des raisons précises (ne me répondez pas que GDI+ est mieux ou qu'avec GDI+ ...).
Je récupère un bitmap via une dll et je voudrais l'afficher sur un DC avec StretchDIBits.

Quelqu'un a t-il implémenté cette api sous vb.net ?

mon code (qui n'affiche rien !!)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
  <StructLayout(LayoutKind.Sequential)> Public Structure BITMAPINFOHEADER
        Public biSize As Integer
        Public biWidth As Integer
        Public biHeight As Integer
        Public biPlanes As Short
        Public biBitCount As Short
        Public biCompression As Integer
        Public biSizeImage As Integer
        Public biXPelsPerMeter As Integer
        Public biYPelsPerMeter As Integer
        Public biClrUsed As Integer
        Public biClrImportant As Integer
    End Structure
 
    <StructLayout(LayoutKind.Sequential)> Public Structure RGBQUAD
        Public rgbBlue As Byte
        Public rgbGreen As Byte
        Public rgbRed As Byte
        Public rgbReserved As Byte
    End Structure
 
    <StructLayout(LayoutKind.Sequential)> Public Structure BITMAPINFO
        Public bmiHeader As BITMAPINFOHEADER
        <MarshalAs(UnmanagedType.ByValArray, sizeconst:=256)> Public bmiColors() As RGBQUAD
    End Structure
Private Declare Function StretchDIBits Lib "gdi32" (ByVal hdc As IntPtr, ByVal x As Integer, ByVal y As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal SrcX As Integer, ByVal SrcY As Integer, ByVal wSrcWidth As Integer, ByVal wSrcHeight As Integer, ByVal lpBits As IntPtr, ByRef lpBitsInfo As BITMAPINFO, ByVal wUsage As Integer, ByVal dwRop As Integer) As Integer
 
Public Sub affichebitmap(ByVal G As Graphics)
        Dim mbinfo As BITMAPINFO
        mbinfo = extGetDIBFromBitmap(Me)
        Dim mhdc As IntPtr = G.GetHdc
        StretchDIBits(mhdc, 0, 0, Width / 40, Height / 40, 0, 0, Width, Height, Data, mbinfo, DIB_RGB_COLORS, SRCAND)
        G.ReleaseHdc()
    End Sub
Sachant que Data contient l'adresse des données bitmap (d'où le byval).
En l'état rien ne s'affiche, si je passe la structure Bitmapinfo par valeur au lieu de le passer par référence là j'affiche un rectangle noir sur le DC de la taille attendue (0,0, Width / 40, Height / 40). Mais il me semble que la fonction attend un pointeur sur la structure, ce devrait donc être "byRef" non ?

De même la nature de la structure BITMAPINFO peut-elle être en cause ?

Dans le code de la fonction extGetDIBFromBitmap
j'écris ceci pour affecter les couleurs (ici bicolore):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
ReDim .bmiColors(255)
                    .bmiColors(0).rgbBlue = 0 : .bmiColors(0).rgbGreen = 0 : .bmiColors(0).rgbRed = 0 'Le premier vaut Red=0,Green=0,Blue=0 donc du noir (#000000)
                    .bmiColors(1).rgbBlue = 255 : .bmiColors(1).rgbGreen = 255 : .bmiColors(1).rgbRed = 255 'Le second vaut Red=255,Green=255,Blue=255 donc blanc (#FFFFFF)
Autre point qui me laisse perplexe si dans ma structure bitmapinfo.bmiheader j'affecte une valeur à .biSize = Len(DibInfo.bmiHeader) (40 octets) j'obtiens une exception à l'appel de l'API. Pourquoi ?