Текущий архив: 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;
На контроле вместо изображения все залито черным. Почему???
← →
k © (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 ;)
← →
k © (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;
← →
k © (2002-10-30 11:34) [5]>SPeller ©
верно, как я мог забыть!
Страницы: 1 вся ветка
Текущий архив: 2002.12.12;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.019 c