![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Копирование 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 а только потом на канвас?