Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.022 c
3-45177
ДенМат
2002-09-21 08:46
2002.10.14
Как определить ФИО пользователя зная его Логин


1-45424
pvasya
2002-10-03 13:52
2002.10.14
BlockWrite


14-45571
Ketmar
2002-09-18 14:19
2002.10.14
господа, а как зовут книжечку, по мотивам которой Half-Life...


3-45184
Kran
2002-09-22 19:42
2002.10.14
Ошибка Unknow database


4-45638
anato
2002-08-31 00:34
2002.10.14
Как запретить показ меню Пуск?