Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

HBitMap & HDC, создание Bitmap c буфером данных изображения [Win95/98]


Nick_N_A ©   (2003-02-04 07:05:00) 

Как создать API-Bitmap, что-бы в итоге был массив, в котором
меняя его элементы - менялись-бы цвета растра, его точки

я даже немного поэксперементировал:
Var
FHandle:HBitMap;// дескриптор битмапа
Data:pointer;// адрес массива данных

procedure CreateDC(DC: HDC; x, y, bitsPerPixel: integer=24);
Var s:tagSize;
Begin
size:=x*y*BitsPerPixel;
FHandle:=CreateCompatibleBitmap(DC,x,y);
GetBitmapDimensionEx(FHandle,s);
SetBitmapDimensionEx(FHandle,x,y,@s);
Data:=GetMemory(size);
//GetBitmapBits(FHandle,size,Data);// [1]
SetBitmapBits(FHandle,size,Data);// [2]
end;
---------------
для получение контекста устройства DC=GetDC(Form1.Handle);
самое интересное, что при отсутствии [2] при попытке нарисовать
FBitMap изображение остается на месте - не работает, как
будто идеально прозрачное,
при наличии строчки [2] чзображение - черный "квадрат"
при этом все попытки поменять данные в Data^, приводят к неудаче,
а при наличии строки [1] делается Capture содержимого окна.

-Как-же все-таки создать битмап, на API, чтобы изображение
было представлено массивом 24-битных цветов (хотелось-бы 32-бита
но с 8-ю=reserved,8-R,8-G,8-B)
-Можно-ли получить адрес аппаратного буфера растра, изображения
окна, т.е. поменяли один цвет - он сразу-же поменялся на экране,
без какого-либо ручного/автоматического вывода на экран

P.S.
Увидеть изо на VCL можно
BM:TBitmap;
BM:=TBitMap.Create;
BM.Handle:=FHandle;
My.Canvas.Draw(Bm,0,0);

Без VCL (импорт из кол)
procedure TBitMap.DrawToDC;
var
DCfrom, DC0: HDC;
oldBmp: HBitmap;
oldHeight: Integer;
B: tagBitmap;
s:tagSize;
begin
GetBitmapDimensionEx(FHandle,s)
Height:=s.cx;
oldHeight := Height;
if GetObject( fHandle, sizeof( B ), @B ) <> 0 then
oldHeight := B.bmHeight;
DC0 := GetDC( 0 );
DCfrom := CreateCompatibleDC( DC0 );
ReleaseDC( 0, DC0 );
oldBmp := SelectObject( DCfrom, fHandle );
BitBlt(FDC, 0{x}, 0{y}, Width, oldHeight, DCfrom, 0, 0, SRCCOPY );
SelectObject( DCfrom, oldBmp );
DeleteDC( DCfrom );
end;

для проверки работоспособности рисования
FHandle:=LoadBitMap(0,pointer(OBM_CLOSE));


MBo   (2003-02-06 06:33:00) [1]

нет, не ошибаешься.


Nick_N_A   (2003-02-06 06:10:00) [2]

В руководстве коротко сказано что SetBitmapBits задает
какието биты отвечающие за рисунок, я так понял, что это и есть байты, отвечающие за сам рисунок, в 24-бит массив 3-х байтных структур RGB. Неужели я ошибаюсь ?


Nick_N_A   (2003-02-06 05:35:00) [3]

Неужели никто никогда не работал с битмапами на АПИ


Nick_N_A   (2003-02-05 05:32:00) [4]

Удалено модератором
Примечание: Приз за орфографию


i-C3H7OH   (2003-02-04 12:20:00) [5]

в DirectDraw - можно, я думаю. в GDI вывод идет только в окна на контекст устройства, там нельзя получить ссылку на видеопамять экрана...


Наверх

Титульная страница Поиск, карта сайта Написать письмо