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

Вниз

Печать на принтер и превью в Win98 - какие-то странные глюки.   Найти похожие ветки 

 
romeo ©   (2003-11-30 17:38) [0]

В своей программе организовал печать и превью векторной графики. Пока занимался ею только на работе (под Win2000) - все было нормально. Решил на выходных дома ударно потрудиться. Дома - Win98SE. И тут началося...

Объясню подробнее что именно делаю:

W := GetDeviceCaps(Printer.Handle, HORZRES);
H := GetDeviceCaps(Printer.Handle, VERTRES);
CompDC := CreateCompatibleDC(Printer.Handle);
B_Handle := CreateCompatibleBitmap(Printer.Handle, W, H);
SelectObject(CompDC, B_Handle);

for Loop := 0 to Objects.Count - 1 do begin
if Objects[Loop].VisibleInRect(PrintableArea) and Objects[Loop].Layer.Visible and Objects[Loop].Layer.Printable
then Objects[Loop].Print(CompDC)
end;

Сами объекты рисуются вот таким макаром:

procedure TPolyLine.Print(hCanvas: hDC; Margins: TPoint; Scale: Real);
var
Loop: Integer;
Pen: hPen;
begin
Pen := CreatePen(PS_SOLID, 1, Color);
SelectObject(hCanvas, Pen);
MoveToEx(hCanvas, Margins.x + Round((Points[0].x - PrintableArea.Left)/Scale), Margins.y + Round((Points[0].y - PrintableArea.Top)/Scale), nil);
for Loop := 0 to FPoints.Count - 1 do begin
LineTo(hCanvas, Margins.x + Trunc((Points[Loop].x - PrintableArea.Left)/Scale), Margins.y + Trunc((Points[Loop].y - PrintableArea.Top)/Scale));
end;
DeleteObject(Pen);
end;

А затем этот CompDC рисую BitBlt-ом на Printer.Canvas.Handle или, если превью - то на PaintBox.Canvas.Handle.

Так вот, если объектов не очень много (сотни две -три) - все работает нормально, превью виден как надо. Если их количество переваливает за какое-то (так и не выяснил какое) значение - в превью рисуется девственно чистый листочек бумажки. А при fmPreview.Close выскакивает занятное сообщение на РУССКОМ языке: "Параметр задан неверно". Шрифт сообщения может изменяться от раза к разу. Если после этого не закрывать программу - то отмечаются странности в перерисовке компонентов на главной форме. Да, если программа была запущена из-под Delphi, то до сообщения дело не доходит - система просто зависает, спасает только кнопочка "Reset" ...

Стал копаться. Выяснил, что если всю уйму объектов рисовать одним и тем же Pen-ом, то все работает нормально, т.е.:

procedure TPolyLine.Print(hCanvas: hDC; Margins: TPoint; Scale: Real);
var
Loop: Integer;
Pen: hPen;
begin
//Pen := CreatePen(PS_SOLID, 1, Color);
//SelectObject(hCanvas, Pen);
MoveToEx(hCanvas, Margins.x + Round((Points[0].x - PrintableArea.Left)/Scale), Margins.y + Round((Points[0].y - PrintableArea.Top)/Scale), nil);
for Loop := 0 to FPoints.Count - 1 do begin
LineTo(hCanvas, Margins.x + Trunc((Points[Loop].x - PrintableArea.Left)/Scale), Margins.y + Trunc((Points[Loop].y - PrintableArea.Top)/Scale));
end;
// DeleteObject(Pen);
end;

Что за полтергейст, блин?!
Если кто знает в чем дело - помогите, а? Заранее спасиба...


 
nikkie ©   (2003-11-30 17:44) [1]

ресурсов не хватило :)
pen у тебя не удаляется.

DeleteObject
If the function succeeds, the return value is nonzero.
If the specified handle is not valid or is currently selected into a DC, the return value is zero.

надо делать так:
Pen := CreatePen(...);
OldPen := SelectObject(hCanvas, Pen);
...
SelectObject(hCanvas, OldPen);
DeleteObject(Pen);


 
romeo ©   (2003-11-30 17:59) [2]


> nikkie © (30.11.03 17:44) [1]


Круто! Respect, спасибо и все такое...



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

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

Наверх




Память: 0.47 MB
Время: 0.018 c
1-36627
pashaz
2003-11-29 08:49
2003.12.12
SMExport


1-36664
hooky-mars
2003-11-30 15:34
2003.12.12
Как остледить обращения к файлам


1-36644
powerslave
2003-12-01 08:34
2003.12.12
Помогите, как создать popup меню?


1-36690
sandy
2003-12-02 19:13
2003.12.12
RichEdit


3-36557
Zetr
2003-11-20 13:31
2003.12.12
Помогите с автоопределением местоположения курсора в Gride