Конвертировать участок памяти в bitmap и нарисовать на форме

Тема в разделе "WASM.BEGINNERS", создана пользователем kw33, 22 июл 2011.

  1. kw33

    kw33 New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2011
    Сообщения:
    12
    Здравствуйте!
    Хочу сделать так: програма на VB6, которая вызывает функцию из моей DLL.
    DLL (на FASM) выделяет память для будущей bitmap-картинки (график по таблице).
    DLL заполняет выделенную память конкретными значениями напрямую, не используя API.
    И надо эту память сконвертировать (скопировать, назначить) в device control (DC) так, чтобы картинка отобразилась на контроле, который находится на главной форме моего VB6-приложения.
    Возможно ли это впринципе?
     
  2. kw33

    kw33 New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2011
    Сообщения:
    12
    Может CreateBitmapIndirect надо использовать?
    А потом BitBlt что-ли...
     
  3. rmka

    rmka Member

    Публикаций:
    0
    Регистрация:
    22 окт 2010
    Сообщения:
    108
    CreateCompatibleBitmap, потом GetDIBits, рисуете в полученном буфере и сохраняете назад через SetDIBits.
     
  4. kw33

    kw33 New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2011
    Сообщения:
    12
    Ага!
    Попробуем...
     
  5. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    HDC compDC = CreateCompatibleDC
    CreateDIBSection(compDC ,,, lpBits, ); // она бытсрее для таких случаем чам Bitmap
    BitBlt( hdc, ,,,, compDC );
     
  6. kw33

    kw33 New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2011
    Сообщения:
    12
    Код (Text):
    1. HBITMAP CreateDIBSection(
    2.   __in   HDC hdc,
    3.   __in   const BITMAPINFO *pbmi,
    4.   __in   UINT iUsage,
    5.   __out  VOID **ppvBits,
    6.   __in   HANDLE hSection,
    7.   __in   DWORD dwOffset
    8. );
    А как заполнить BITMAPINFO *pbmi?
    У меня есть hdc-контекст контрола, **ppvBits-указатель на указатель на массив байтов, кодирующих пиксели, hSection = dwOffset = 0, чтобы память была выделена автоматом; iUsage = DIB_PAL_COLORS или DIB_RGB_COLORS ?
     
  7. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    http://forum.vingrad.ru/topic-117538.html
    http://otvet.mail.ru/question/37778852/
    http://www.google.com/codesearch#RNY0MQIrFHY/tk/win/tkWinWm.c&ct=rc&cd=2&q=CreateDIBSection
    http://www.google.com/codesearch#U7wUR84Lbbw/trunk/Drawing.cpp&ct=rc&cd=6&q=CreateDIBSection
     
  8. kw33

    kw33 New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2011
    Сообщения:
    12
    Код (Text):
    1.  FASM
    2. section '.data' data readable writeable
    3.  
    4.  hInstance dd 0
    5.  hDC       dd 0
    6.  hBitmap   dd 0
    7.  hMemDC    dd 0
    8.  
    9. ;BITMAP structure
    10.  
    11. sBITMAP dd 0
    12.         dd 10 ;dx
    13.         dd 10 ;dy
    14.         dd 40 ; bytes in scan line
    15.         dw 1
    16.         dw 32 ; bits per pixel
    17.         dd bmap ; указатель на массив бит (растр)
    18.  
    19. ; bitmap:
    20.  
    21. bmap   dd 10*10 dup (00FF0000h) ; заполняем красным цветом
    22.  
    23. section '.text' code readable executable
    24.  proc  GrafikInit  hWnd, DX, DY
    25.         invoke CreateBitmapIndirect, sBITMAP
    26.         mov     [hBitmap], eax
    27.         invoke GetDC, [hWnd]
    28.         mov     [hDC], eax
    29.         invoke CreateCompatibleDC, eax
    30.         mov     [hMemDC], eax
    31.         invoke SelectObject, [hMemDC], [hBitmap]
    32.         invoke BitBlt, [hDC], 13,13,[DX],[DY],\
    33.                        [hMemDC],0,0,SRCCOPY ; координаты для примера
    34.     invoke ReleaseDC, [hWnd], [hDC]
    35.     invoke DeleteDC, [hMemDC]
    36.     invoke DeleteObject, [hBitmap]
    37.         ret
    38.  endp