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

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

Копирование HBitmap [D6, WinXP]


Th ©   (2002-10-24 20:36:00) 

Народ, кто может объяснить, почему не работвет вот такой кусок кода:

{функция, предоставляющая возможность вывести картинку из DC на контрол:}

procedure TMyControl.SetImageFromHDC(DC:HDC);
var BMP:Bitmap;

begin
GetObject(GetCurrentObject(DC,OBJ_BITMAP),sizeof(BMP),@BMP);

{далее ImageWidth,ImageHeight:integer; ImageDC:HDC - переменные класса TMyControl}
BitBlt(ImageDC,0,0,BMP.bmWidth,BMP.bmHeight,DC,0,0,SRCCOPY);

ImageWidth:=BMP.bmWidth;
ImageHeight:=BMP.bmHeight;

Invalidate;
end;

...

procedure TMyControl.Paint;
begin
...
BitBlt(Canvas.Handle,0,0,ImageWidth,ImageHeight,ImageDC,0,0,SRCCOPY);
...
end;


На контроле вместо изображения все залито черным. Почему???


k   (2002-10-30 11:34:00) [1]

>SPeller ©
верно, как я мог забыть!


SPeller   (2002-10-30 01:35:00) [2]

Не забывайте правильно высвобождать ресурсы:

procedure TMyControl.Paint;
var dc:hdc; oo: Cardinal
begin
...
dc :=CreateCompatibleDC(0);
oo :=SelectObject(dc,ImageH )
BitBlt(Canvas.Handle,0,0,ImageWidth,ImageHeight,DC,0,0,SRCCOPY);
SelectObject(dc, oo);
DeleteDC(dc);
...
end;


k   (2002-10-29 21:37:00) [3]

Th © >
>(только bmbits как ни странно nil, но это не влияет на проблему)
- так может в этом и проблема... как битмап получаешь?

а я бы делал так:

вместо ImageDC в классе контролла ImageH:HBITMAP;

procedure TMyControl.Paint;
var dc:hdc;
begin
...
dc :=CreateCompatibleDC(0);
SelectObject(dc,ImageH )
BitBlt(Canvas.Handle,0,0,ImageWidth,ImageHeight,DC,0,0,SRCCOPY);
DeleteDC(dc);
...
end;

и насчет Тбитмап - почему бы и нет - все равно VCL используешь.
или FastDIB...
а если хочешь я могу на мыло скинуть свой класс для работы с битмап на ВинАпи. там всего пара строк. но это завтра...

удачи



Th   (2002-10-28 12:54:00) [4]

1. Да в перед вызовом процедуры SetImageFromHDC создается DC
DC:=CreateCompatibleDC(0);
и в него выбирается HBitmap. Кстати успешность этого мероприятия подтверждается тем, что структура BMP заполняется корректно (только bmbits как ни странно nil, но это не влияет на проблему):
GetObject(GetCurrentObject(DC,OBJ_BITMAP),sizeof(BMP),@BMP);

2. А как иначе? Если у меня есть компонент (в данном случае TMyСontrol) в котором должна хранится картинка и выводится при отрисовке контрола. Я же не могу рисовать на контрол прямо из SetImageFromHDC - это негигиенично.

PS Только плз, не предлагайте использовать TBitmap ;)


k   (2002-10-25 15:26:00) [5]

у меня к тебе сразу 2 вопроса
1. откуда на dc берется Bitmap (т.е. SelectObject делается?) и каким образом получашь dc?
2. зачем все так сложно, с одного dc на ImageDC а только потом на канвас?


Наверх

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