Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.12;
Скачать: CL | DM;

Вниз

Копирование HBitmap   Найти похожие ветки 

 
Th ©   (2002-10-24 20:36) [0]

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

{функция, предоставляющая возможность вывести картинку из 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;


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


 
©   (2002-10-25 15:26) [1]

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


 
Th ©   (2002-10-28 12:54) [2]

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

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

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


 
©   (2002-10-29 21:37) [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...
а если хочешь я могу на мыло скинуть свой класс для работы с битмап на ВинАпи. там всего пара строк. но это завтра...

удачи




 
SPeller ©   (2002-10-30 01:35) [4]

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

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;


 
©   (2002-10-30 11:34) [5]

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



Страницы: 1 вся ветка

Текущий архив: 2002.12.12;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.019 c
7-36446
Евген
2002-10-07 15:44
2002.12.12
Событие при закрытии дверцы CD-ROM


3-35989
Ajvol
2002-11-22 20:44
2002.12.12
Локальная фильтрация в FIBplus - не всё


3-35986
Icehand
2002-11-19 12:58
2002.12.12
Как вернуть датасет из хранимой процедуры Oracle?


14-36395
Sergo
2002-11-20 14:07
2002.12.12
ПРОЩАЙТЕ!!!


1-36208
^Sanya
2002-12-01 14:52
2002.12.12
TMemo or TRichEdit: