'Erstellen Sie folgende Steuerelemente: 'CommandButton            Command1, CommandButton            Command2, Form                     Form1,  ' 
 '-- Form1, Picture1, Command1, Command2, 1.bmp (Bitmap-Datei in App.Path)
Option Explicit
 
Private Const DIB_RGB_COLORS      As Long = 0
Private Const OBJ_BITMAP          As Long = 7
 
Private Type BITMAPINFOHEADER
    biSize As Long
    biWidth As Long
    biHeight As Long
    biPlanes As Integer
    biBitCount As Integer
    biCompression As Long
    biSizeImage As Long
    biXPelsPerMeter As Long
    biYPelsPerMeter As Long
    biClrUsed As Long
    biClrImportant As Long
End Type
 
Private Type BITMAP
    bmType       As Long
    bmWidth      As Long
    bmHeight     As Long
    bmWidthBytes As Long
    bmPlanes     As Integer
    bmBitsPixel  As Integer
    bmBits       As Long
End Type
 
Private Type RGBQUAD
    rgbBlue As Byte
    rgbGreen As Byte
    rgbRed As Byte
    rgbReserved As Byte
End Type
 
Private Type BITMAPINFO
    bmiHeader As BITMAPINFOHEADER
    bmiColors As RGBQUAD
End Type
 
Private Declare Function CreateFile Lib "kernel32.dll" _
    Alias "CreateFileA" ( _
    ByVal lpFileName As String, _
    ByVal dwDesiredAccess As Long, _
    ByVal dwShareMode As Long, _
    lpSecurityAttributes As Any, _
    ByVal dwCreationDisposition As Long, _
    ByVal dwFlagsAndAttributes As Long, _
    ByVal hTemplateFile As Long) As Long
 
Private Declare Function CreateFileMapping Lib "kernel32.dll" Alias _
    "CreateFileMappingA" ( _
    ByVal hFile As Long, _
    ByVal lpFileMappigAttributes As Long, _
    ByVal flProtect As Long, _
    ByVal dwMaximumSizeHigh As Long, _
    ByVal dwMaximumSizeLow As Long, _
    ByVal lpName As String) As Long
 
'Private Declare Function OpenFileMapping Lib "kernel32.dll" _
    Alias "OpenFileMappingA" ( _
    ByVal dwDesiredAccess As Long, _
    ByVal bInheritHandle As Long, _
    ByVal lpName As String) As Long
 
 
' Erstellen eines geräte-unabhängigen Bildes (Device Independent Bitmap, DIB)
Private Declare Function CreateDIBSection Lib "gdi32" _
    (ByVal hDC As Long, ByRef pbmi As BITMAPINFO, ByVal iUsage As Long, ByRef _
    ppvBits As Long, ByVal hSection As Long, ByVal dwOffset As Long) As Long
 
Private Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, _
    ByVal hObject As Long) As Long
 
Private 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
 
Private Declare Function DeleteDC Lib "gdi32" (ByVal hDC As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDC As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" ( _
    ByVal hObject As Long) As Long
Private Declare Sub ZeroMemory Lib "kernel32" Alias "RtlZeroMemory" ( _
    lpDst As Any, ByVal Length As Long)
 
'Private Declare Function MapViewOfFile Lib "kernel32" ( _
    ByVal hFileMappingObject As Long, _
    ByVal dwDesiredAccess As Long, _
    ByVal dwFileOffsetHigh As Long, _
    ByVal dwFileOffsetLow As Long, _
    ByVal dwNumberOfBytesToMap As Long) As Long
 
'Private Declare Function UnmapViewOfFile Lib "kernel32" ( _
    lpBaseAddress As Any) As Long
 
 
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
    ByVal pDest As String, _
    ByVal pSrc As Long, _
    ByVal ByteLen As Long)
Private Declare Function GetObjectType Lib "gdi32" (ByVal hgdiobj As Long) As Long
Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" ( _
       ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
 
'MISC consts
Private Const VT_BY_REF = &H4000
Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const MOVEFILE_REPLACE_EXISTING = &H1
Private Const FILE_ATTRIBUTE_TEMPORARY = &H100
Private Const FILE_ATTRIBUTE_NORMAL = &H80
Private Const FILE_BEGIN = 0
Private Const CREATE_NEW = 1
Private Const OPEN_EXISTING = 3
Private Const OPEN_ALWAYS = 4
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const PAGE_READWRITE = 4
Private Const FILE_MAP_WRITE = &H2
Private Const FILE_MAP_READ = &H4
Private Const FADF_FIXEDSIZE = &H10
Private Const INVALID_HANDLE_VALUE = -1
 
'Create -- Set backColor  ********************************************
Private Type RECT2
    X1 As Long
    Y1 As Long
    X2 As Long
    Y2 As Long
End Type
 
Private Declare Function SetRect Lib "user32" (lpRect As RECT2, _
    ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, _
    ByVal Y2 As Long) As Long
 
Private Declare Function FillRect Lib "user32" (ByVal hDC As Long, _
    lpRect As RECT2, ByVal hBrush As Long) As Long
 
Private Declare Function CreateSolidBrush Lib "gdi32" ( _
    ByVal crColor As Long) As Long
 
Private m_BackColor As OLE_COLOR
 
 
Dim hFile     As Long
Dim hFileMap  As Long
Dim m_hDIb    As Long
Private m_HDC As Long
Dim m_lpBits  As Long
Dim m_hOldDIB As Long
Dim m_uBIH    As BITMAPINFO
Dim m_BytesWidth  As Long
Private MapW     As Long
Private MapH     As Long
 
 
Private Sub Command1_Click() '-- Schreiben
 
 Dim uBI      As BITMAP
 Dim lhDC     As Long
 Dim lhOldBmp As Long, image As StdPicture
 
 Set image = Picture1.Picture
 
 
 If (Not image Is Nothing) Then
 
        If (GetObjectType(image.Handle) = OBJ_BITMAP) Then
 
            Call GetObject(image.Handle, Len(uBI), uBI)
 
            If (Create(uBI.bmWidth, uBI.bmHeight)) Then
 
                lhDC = CreateCompatibleDC(0)
                If (lhDC <> 0) Then
                    lhOldBmp = SelectObject(lhDC, image.Handle)
 
                    '-- Load uBits
                    Call BitBlt(m_HDC, 0, 0, uBI.bmWidth, uBI.bmHeight, _
                                                    lhDC, 0, 0, vbSrcCopy)
 
                    '-- Destroy temp. DC
                    Call SelectObject(lhDC, lhOldBmp)
                    Call DeleteDC(lhDC)
 
                    Call Destroy
 
                    '-- DIB-TEST ==> m_HDC sollte leer sein
                    Picture1.Picture = LoadPicture("")
                    Call BitBlt(Picture1.hDC, 0, 0, m_uBIH.bmiHeader.biWidth, m_uBIH.bmiHeader.biHeight, _
                                                    m_HDC, 0, 0, vbSrcCopy)
                    Picture1.Refresh
                End If
            End If
        End If
    End If
End Sub
 
 
Private Sub Command2_Click() '-- Lesen
 
     '-- Prepare header
    With m_uBIH.bmiHeader
        .biSize = Len(m_uBIH.bmiHeader)
        .biPlanes = 1
        .biBitCount = 24
        .biWidth = MapW
        .biHeight = MapH
        m_BytesWidth = (.biWidth * (.biBitCount \ 8) + 3) And -4&
        .biSizeImage = .biHeight * m_BytesWidth
    End With
 
    '-- DIB erstellen und Speicher auslesen
    m_HDC = CreateCompatibleDC(0)
    If m_HDC <> 0 Then
       m_hDIb = CreateDIBSection(m_HDC, m_uBIH, DIB_RGB_COLORS, m_lpBits, hFileMap, 0)
       If m_hDIb <> 0 Then
          '-- Select into a DC device context
          m_hOldDIB = SelectObject(m_HDC, m_hDIb)
       End If
    End If
 
    '-- Bild Laden
    Picture1.Picture = LoadPicture("")
    Call BitBlt(Picture1.hDC, 0, 0, m_uBIH.bmiHeader.biWidth, m_uBIH.bmiHeader.biHeight, _
                                                    m_HDC, 0, 0, vbSrcCopy)
    Picture1.Refresh
 
End Sub
 
 
Public Function Create(ByVal NewWidth As Long, ByVal NewHeight As Long) As Long ', Optional ByVal NewBPP As dibBPPCts = [32_bpp]) As Long
    Dim uRect  As RECT2
    Dim hBrush As Long
 
    CloseHandle hFile
    CloseHandle hFileMap
    Call Destroy
 '   Kill App.Path & "\Test.bmp"
 
      '-- Prepare header
    With m_uBIH.bmiHeader
        .biSize = Len(m_uBIH.bmiHeader)
        .biPlanes = 1
        .biBitCount = 24
        .biWidth = NewWidth
        .biHeight = NewHeight
        m_BytesWidth = (.biWidth * (.biBitCount \ 8) + 3) And -4&
        .biSizeImage = .biHeight * m_BytesWidth
        MapW = .biWidth
        MapH = .biHeight
    End With
 
    '-- Erstellen einer 0-Byte Datei
    hFile = CreateFile(App.Path & "\Test.bm", GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ, ByVal 0&, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0&)
 
    '-- Handle auslesen sowie Speicher einlesen und Datei schreiben
    hFileMap = CreateFileMapping(hFile, 0, PAGE_READWRITE, 0, m_uBIH.bmiHeader.biSizeImage, ByVal 0&) '"MyDIB")
 
    '-- Create DIB section
    m_HDC = CreateCompatibleDC(0) '-- oder: (PictureBox.hDC)
    If (m_HDC <> 0) Then
        '-- Create DIB
        m_hDIb = CreateDIBSection(m_HDC, m_uBIH, DIB_RGB_COLORS, m_lpBits, hFileMap, 0)
     '   If (m_hDIb = 0) Then m_hDIb = CreateDIBSection(m_HDC, m_uBIH, DIB_RGB_COLORS, m_lpBits, 0, 0)
        If (m_hDIb <> 0) Then
            '-- Select into a DC device context
           m_hOldDIB = SelectObject(m_HDC, m_hDIb)
           '-- Set backColor
           Call SetRect(uRect, 0, 0, NewWidth, NewHeight)
           hBrush = CreateSolidBrush(m_BackColor)
           Call FillRect(m_HDC, uRect, hBrush)
           Call DeleteObject(hBrush)
        Else
           Call Destroy
           MsgBox "Fehler m_hDib"
        End If
    End If
    '-- Success
    Create = m_hDIb
End Function
 
 
Private Sub Destroy()
    '-- Destroy DIB
    If (m_HDC <> 0) Then
        If (m_hDIb <> 0) Then
            Call SelectObject(m_HDC, m_hOldDIB)
            Call DeleteObject(m_hDIb)
        End If
        Call DeleteDC(m_HDC)
    End If
 
    '-- Reset BIH structure
    Call ZeroMemory(m_uBIH, Len(m_uBIH))
 
    '-- Reset DIB vars.
    m_HDC = 0
    m_hDIb = 0
    m_hOldDIB = 0
    m_lpBits = 0
End Sub
 
 
Private Sub Form_Load()
    Picture1.ScaleMode = 3
    Picture1.AutoRedraw = True
    Picture1.AutoSize = True
    Picture1.Picture = LoadPicture(App.Path & "\1.bmp")
    m_BackColor = vbWhite
    Me.Caption = "Create FileMapping"
    Command1.Caption = "Map-Einlesen und DIB löschen"
    Command2.Caption = "Map-Auslesen und DIB füllen"
End Sub
 |