Текущий архив: 2002.10.14;
Скачать: CL | DM;
Вниз
Отрисовка метафайла и ClipRegion Найти похожие ветки
← →
nsv (2002-06-11 15:37) [0]Кто-нибудь отрисовывал Метафайл через PlayEnhMetafile на HDC,
для которой перед этим выбран непрямоугольный ClipRegion.
Упрощенный пример ниже.
var
R:rect;
wmff:TMetafile;
dstrgn,oldrgn:HRGN;
bmp:tbitmap;
pp:array of tpoint;
....
bmp:=tbitmap.create; bmp.pixelformat:=pf24bit;
bmp.width:=form1.Clientwidth; bmp.height:=form1.ClientHeight;
oldrgn:=CreateRectRgn(0,0,bmp.width,bmp.height);
dstrgn:=CreatePolygonRgn(Ppoint(pp)^,5,ALTERNATE);
selectObject(bmp.canvas.Handle,dstrgn);
PlayEnhMetaFile(bmp.canvas.Handle,wmff.Handle, R);
selectObject(bmp.canvas.Handle,oldrgn);
deleteobject(dstrgn);
...
bmp.free;
deleteobject(oldrgn);
Что-то быстро съедаются GDI ресурсы. Есть ли выход?
С прямоугольной облаcтью все нормально.
Нужен вывод метафайла именно в непрямоугольную область.
Если делать операцию BitBlt с любым типом ClipRegion то
все нормально.
← →
int64 (2002-06-11 17:10) [1]Имхо, у тебя регионы не "очищаются".
← →
nsv (2002-06-11 18:03) [2]А как регионы очищать. Я ведь после отрисовки их удаляю.
А других функций очистки что-то не нашел.
Эта проблема у меня неожидано возникла только при отрисовке
метафайла.
← →
int64 (2002-06-11 18:33) [3]У меня были такие глюки, когда заюзанные регионы deleteobject не удалялись (D5, Win95/98). И когда их собиралось очень много, шли глюки. Не знаю, чьи это проблемы 9* или D5, но под ХР/Д6 проблем таких нет.
Я вместе с deleteobject, ещё писал rgn:= 0;
Всё работало.
← →
nsv (2002-06-11 20:57) [4]К сожалению
dstrgn:=0 и oldrgn:=0 ,которые вставил после DeleteObject
не помогли.
Кстати у меня D5/win98.
← →
int64 (2002-06-11 22:58) [5]Дело может и не в регионах. Хотя, по видимому, больше невчем.
Я тогда не разобрался в чём была проблема, потому что вообще отказался от регионов.
Вот откопал из истории проекта функцию:
procedure TGraphPage.EnabledClipRgn(ARect: TRect; M_OR_RBM: boolean = True);
begin
try
if M_OR_RBM then
begin
DeleteObject(RgnM);
RgnM:=0;
RgnM := CreateRectRgnInDiRect(ARect);
SelectClipRgn(Matrix.Canvas.Handle, RgnM);
end else
begin
DeleteObject(RgnRBM);
RgnRBM:=0;
RgnRBM := CreateRectRgnInDiRect(ARect);
SelectClipRgn(ReDrawBitmap.Canvas.Handle, RgnRBM);
end
except
DemoMessage("EnabledClipRgn error!")
end;
end;
Эта функция вызывалась на OnMouseMove и глюки возникали где-то с 16000 вызова. Так вот, точно помню, что остановил эти глюки только присваивяя регионам 0.
Ты лучше локализуй ошибку: из-за регионов ли она.
← →
nsv (2002-06-12 15:28) [6]Проблема поедания ресурсов возникает именно при сочетании функции PlayEnhMetaFile
и
selectObject(bmp.canvas.Handle,dstrgn);
Как только убираю selectObject(bmp.canvas.Handle,dstrgn), то
все впорядке.
У меня проблема другого рода, чем в твоем примере. Так как
пара десятков моих отрисовок съедают 1% GDI ресурса.
Если ответов не будет, единственный выход написать на VC++, чтобы определить в чем проблема : в W98 или в D5, так как D6
у меня нет.
Страницы: 1 вся ветка
Текущий архив: 2002.10.14;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.007 c