hBitmap из файла

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Gotha
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 106
Зарегистрирован: 20.04.2006 (Чт) 10:55
Откуда: Красногорск

hBitmap из файла

Сообщение Gotha » 07.05.2006 (Вс) 15:18

проблема в том что я пытаюсь прочитать бмп-файл в начале которого стоит 2 байта портящие файл.. помогите копирнуть буфер из бмп-хи в hBitmap не копируя его во временный файл, а манипуляциями с КопиМемори
Du stirbst. Besitz stirbt.
Die Sippen sterben.
Der einzig lebt - wir wissen es
Der Toten Tatenruhm.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 07.05.2006 (Вс) 15:45

Приведи код, которым загружаешь рисунок.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Gotha
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 106
Зарегистрирован: 20.04.2006 (Чт) 10:55
Откуда: Красногорск

Сообщение Gotha » 07.05.2006 (Вс) 16:05

сорри, ошибся, точнее в начале файла нет сигнатуры "BM":

Код: Выделить всё
dim s$
        s = Space(FileLen("c:\1.txt"))
        Open "c:\1.txt" For Binary As #1
        Get #1, , s
        Close #1
        s = "BM" & s
        Open "c:\1.bmp" For Binary As #1
        Put #1, , s
        Close #1
        Set Form1.picture = LoadPicture("c:\1.bmp")

это примерный вариант с созданием временного файла, а как без него? мне главное hBitmap получить, а дальше я с помощью OleCreatePictureIndirect пикчер создам
Du stirbst. Besitz stirbt.
Die Sippen sterben.
Der einzig lebt - wir wissen es
Der Toten Tatenruhm.

Gotha
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 106
Зарегистрирован: 20.04.2006 (Чт) 10:55
Откуда: Красногорск

Сообщение Gotha » 07.05.2006 (Вс) 17:01

черт, только счас заметил, тему не в той ветке создал :?
Du stirbst. Besitz stirbt.
Die Sippen sterben.
Der einzig lebt - wir wissen es
Der Toten Tatenruhm.

Gotha
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 106
Зарегистрирован: 20.04.2006 (Чт) 10:55
Откуда: Красногорск

Сообщение Gotha » 07.05.2006 (Вс) 18:08

никак не могу найти, где я тут оконфузился :cry:
Код: Выделить всё
Private Function GetMinimap&(ByVal fileMiniMap$)
Dim tbuf$, buf() As Byte
Dim bf As BITMAPFILEHEADER, bif As BITMAPINFOHEADER, bi As BITMAPINFO
Dim hb&, bufim&

    tbuf = Space(FileLen(fileMiniMap$))
    Open fileMiniMap For Binary As #1: Get #1, , tbuf: Close #1
    buf = "BM" & tbuf
   
    CopyMemory bf, buf(0), Len(bf)
    CopyMemory bif, buf(Len(bf)), Len(bif)
    CopyMemory bi.bmiHeader, bif, Len(bif)

    hb = CreateDIBSection(0, bi, 0, bufim, 0, 0)
    CopyMemory bufim, buf(bf.bfOffBits), 4

    GetMinimap = hb
End Function
Du stirbst. Besitz stirbt.
Die Sippen sterben.
Der einzig lebt - wir wissen es
Der Toten Tatenruhm.

Gotha
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 106
Зарегистрирован: 20.04.2006 (Чт) 10:55
Откуда: Красногорск

Сообщение Gotha » 07.05.2006 (Вс) 18:16

таинственный БВ, ты чего пропал? :D
Du stirbst. Besitz stirbt.
Die Sippen sterben.
Der einzig lebt - wir wissen es
Der Toten Tatenruhm.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 07.05.2006 (Вс) 20:34

Я не пропадал, и чего это я таинственный :)

Не могу понять одну вещь - зачем тебе нужна своя загрузка, если есть LoadPicture?...

Код: Выделить всё
Option Explicit

Private Type BITMAPFILEHEADER
    bfType As Integer
    bfSize As Long
    bfReserved1 As Integer
    bfReserved2 As Integer
    bfOffBits As Long
End Type

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 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 Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Declare Function CreateBitmap Lib "gdi32.dll" (ByVal nWidth As Long, ByVal nHeight As Long, ByVal nPlanes As Long, ByVal nBitCount As Long, ByRef lpBits As Any) As Long

Private Function hBitmapFromFile(ByVal strFileName As String) As Long
    Dim bBMPData() As Byte
    Dim n As Long
    Dim BFH As BITMAPFILEHEADER
    Dim BIH As BITMAPINFOHEADER
    Dim BI As BITMAPINFO
    n = FreeFile
    Open strFileName For Binary Access Read As #n
        Get #n, 1, BFH
        Get #n, 15, BIH
        ReDim bBMPData(0 To 2, BIH.biWidth - 1, BIH.biHeight - 1)
        Get #n, 55, bBMPData
    Close #n
    MoveMemory BI.bmiHeader, BIH, Len(BIH)
    hBitmapFromFile = CreateBitmap(BI.bmiHeader.biWidth, BI.bmiHeader.biHeight, _
        BI.bmiHeader.biPlanes, BI.bmiHeader.biBitCount, bBMPData(0, 0, 0))
End Function
Последний раз редактировалось BV 07.05.2006 (Вс) 21:33, всего редактировалось 2 раз(а).
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Gotha
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 106
Зарегистрирован: 20.04.2006 (Чт) 10:55
Откуда: Красногорск

Сообщение Gotha » 07.05.2006 (Вс) 20:38

BV спасибо большое, а не мог бы мне разьяснить, в чем я ступил в своем варианте?

з.ы. я не юзаю ЛоадПикчер потому, что в начале тех файлов которых емупридется открывать нет сигнатуры "BM", а почему не стал делать временные бмп-хи - для скорости загрузки всего
Du stirbst. Besitz stirbt.
Die Sippen sterben.
Der einzig lebt - wir wissen es
Der Toten Tatenruhm.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 08.05.2006 (Пн) 0:35

а не мог бы мне разьяснить, в чем я ступил в своем варианте?


Хм... Для начала, так файлы не читают. CreateDIBSection возвращает 0 из-за неправильно прочитанной структуры BITMAPINFO.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 125

    TopList