Текущий архив: 2007.03.04;
Скачать: CL | DM;
Вниз
Печать и предпредпросмотр :) Найти похожие ветки
← →
RASkov (2007-02-09 13:14) [0]Народ, кто занимался вплотную выводом на печать подскажите как правильно сделать процедуру вывода на канву и в зависимости чья канва(экран, принтер) вывести корректно на любую. Заголовок процедуры:
procedure PaintCnv(Cnv: TCanvas; const Pr: Boolean);
вызов:procedure TForm1.Button1Click(Sender: TObject);
begin
PaintCnv(PaintBox1.Canvas, False);
PaintCnv(Printer.Canvas, True);
end;
Все линии, круги, квадраты, прямоугольники выводятся нормально(т.е. у меня получается преобразовать координаты), а вот со шрифтом проблема.
Если интересен код процедуры могу показать, но он неверный(и их уже несколько вариантов), поэтому специально не показываю, дабы не путаться.
Как правильно выводить Font на канву?
Если в процедуре ставить SetMapMode(Cnv.Handle, MM_TEXT); то Font.Size"ом масштаб текста не отыграешь,
если по другому, например SetMapMode(Cnv.Handle, MM_HIMETRIC); то вообще ниче не получается. Компоненты не предлагайте. Ввиду того, что мне не нужно показывать как это будет на листе. А отоброзить на канве(например PaintBox"a) еденичный рисунок,затем на печать будет выведено группа таких рисунков, и здесь можно использовать сторонний компонент. Типа предпредпросмотра. Думаю подробно все расписал, но если что не понятно спрашивайте - добавлю.
ЗЫ Исх. код компонента(который у меня есть) смотрел, но нифика не понял, к сожалению :(
← →
TRUNK © (2007-02-09 13:57) [1]Лично я безо всякого SetMapMode делал. Присваивал необходимое значение Canvas.Font.Height. Главное, чтобы шрифт был TrueType.
← →
RASkov (2007-02-09 14:22) [2]> [1] TRUNK © (09.02.07 13:57)
А Font.Height вместо Font.Size в данном вопросе чем может помочь? Сейчас попробую...
> All
Вот некоторые моменты из процедуры
W:=MmToPixX(60, False); //90 mm
X:=MmToPixX(15, False); //15 mm
H:=MmToPixY(120, False, False); //120 mm
if Pr then begin
R:=Rect(0, 0, W, H);
end else begin
W:=Round(W*0.3);
X:=Round(X*0.3);
H:=Round(H*0.3);
R:=Rect(0, 0, W, H);
Font.Size:=???
end;
Rectangle(R);
TextRect(R, R.Left+X, R.Bottom div 2, "1234567890 0123456789 01234567891234567890987654321");
В данный момент процедура служит только в тестовых целях.
Нужно кам можно более приближенно воспроизвести картинку на канве PaintBoxa, к картинке на канве принтера.
← →
TRUNK © (2007-02-09 14:29) [3]То есть проблема в том, какое значение присвоить Font.Size ?
← →
RASkov (2007-02-09 14:42) [4]> [3] TRUNK © (09.02.07 14:29)
Проблема в том, что нужно вывести строку на канву принтера и на канву PaintBox"а одинаково
Т.е. я делаю так: рисую квадрат и отступая 15 мм от левого края квадрата вывожу строку
Вот пытаюсь добиться, чтобы строка, при разных значениях размера(имени, стиля) шрифта выводилась более менее одинаково как на принтер так и на PaintBox.
Но как смаштабировать текст незнаю.
Возможно нужно использовать TMetafileCanvas. С ним я не разу не работал. Вопрос в чем отличия TMetafileCanvas от TCanvas?
← →
RASkov (2007-02-09 14:57) [5]> То есть проблема в том, какое значение присвоить Font.Size?
Size"ом не отыграешься - резские скачки получаются...
А вот Font.Height ведет себя по разному при выводе на принтер и на паинтбокс... сейчас еще с ним помудрую, но чувствую, что все не так надо делать и немогу понять как:( Здесь наверняка нужно как-то учитывать разрешение принтера, при переводе мм в пиксели я учитываю - это у квадрата, а фонту незнаю как...
← →
TRUNK © (2007-02-09 15:01) [6]// для монитора
ScreenHDC := GetDC(0);
DisplayVisLogicWidth := GetDeviceCaps(ScreenHDC,HORZRES);
DisplayVisLogicHeight := GetDeviceCaps(ScreenHDC,VERTRES);
DisplayVisMetricWidth := GetDeviceCaps(ScreenHDC,HORZSIZE); // мм (приблизительно)
DisplayVisMetricHeight := GetDeviceCaps(ScreenHDC,VERTSIZE); // мм (приблизительно)
DisplayPixPerMillimeterX := DisplayVisLogicWidth/DisplayVisMetricWidth;
DisplayPixPerMillimeterY := DisplayVisLogicHeight/DisplayVisMetricHeight;
// для принтера
PrinterVisLogicWidth := GetDeviceCaps(Printer.Handle,HORZRES);
PrinterVisLogicHeight := GetDeviceCaps(Printer.Handle,VERTRES);
PrinterVisMetricWidth := GetDeviceCaps(Printer.Handle,HORZSIZE); // мм
PrinterVisMetricHeight := GetDeviceCaps(Printer.Handle,VERTSIZE); // мм
PrinterPixPerMillimeterX := PrinterVisLogicWidth/PrinterVisMetricWidth;
PrinterPixPerMillimeterY := PrinterVisLogicHeight/PrinterVisMetricHeight;
PrinterPhysLogicWidth := GetDeviceCaps(Printer.Handle,PHYSICALWIDTH);
PrinterPhysLogicHeight := GetDeviceCaps(Printer.Handle,PHYSICALHEIGHT);
PrinterPhysMetricWidth := PrinterPhysLogicWidth/PrinterPixPerMillimeterX; // мм
PrinterPhysMetricHeight := PrinterPhysLogicHeight/PrinterPixPerMillimeterY; // мм
PrinterLogicOffsetX := GetDeviceCaps(Printer.Handle,PHYSICALOFFSETX);
PrinterLogicOffsetY := GetDeviceCaps(Printer.Handle,PHYSICALOFFSETY);
PrinterMetricOffsetX := PrinterLogicOffsetX/PrinterPixPerMillimeterX; // мм
PrinterMetricOffsetY := PrinterLogicOffsetY/PrinterPixPerMillimeterY; // мм
Думаю этих данных будет достаточно, чтобы произвести любое необходимое масштабирование.
← →
RASkov (2007-02-09 15:12) [7]> [6] TRUNK © (09.02.07 15:01)
Спасибо.
Дык вот данные-то у меня эти есть, я несоображу как мне ими воспользоваться для Fonta:(
с Pen"ом все ок получается миллиметр в миллиметр, а вот со шрифтом..
Вот сейчас буду мучить Font.Height по моему для моих целей подойдет.
← →
TRUNK © (2007-02-09 15:21) [8]MetricFontHeight := 5; // мм
Printer.Canvas.Font.Height := trunc(MetricFontHeight*PrinterPixPerMillimeterY);
PaintBox.Canvas.Font.Height := trunc(MetricFontHeight*DisplayPixPerMillimeterY);
← →
RASkov (2007-02-09 18:36) [9]> [8] TRUNK © (09.02.07 15:21)
Вот спасибо!
Правда не совсем точно ;) но мне вполне хватит. Вот что примерно вышло:function GetSizeX(const HD: HDC; const FSzMm: Integer): Integer;
begin
Result := Round(FSzMm*(GetDeviceCaps(HD, HORZRES)/GetDeviceCaps(HD, HORZSIZE)));
end;
function GetSizeY(const HD: HDC; const FSzMm: Integer): Integer;
begin
Result := Round(FSzMm*(GetDeviceCaps(HD, VERTRES)/GetDeviceCaps(HD, VERTSIZE)));
end;
procedure PaintCnv(Cnv: TCanvas; const Wmm, Hmm: Integer; const Pr: Boolean);
var R: TRect; W, H, X: Integer;
begin
with Cnv do begin
Brush.Style:=bsClear;
Font.Name:="Times New Roman";
Font.Height:=GetSizeY(Handle, 6);
W:=GetSizeX(Handle, Wmm);
X:=GetSizeX(Handle, 15);
H:=GetSizeY(Handle, Hmm);
Font.Color:=clRed;
Font.Style:=[fsBold, fsItalic];
R:=Rect(0, 0, W, H);
Rectangle(R);
TextRect(R, R.Left+X, R.Bottom div 2, "S1234567890 10123456789 20123456789 30123456789 40123456789");
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
const W=60; H=120;
begin
PaintCnv(PaintBox1.Canvas, W, H, False);
if (MessageBox(Handle, "Напечатать", "", MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON2) = idYes) then begin
Printer.BeginDoc;
PaintCnv(Printer.Canvas, W, H, True);
Printer.EndDoc;
end;
end;
Еще раз огромное спасибо.
Страницы: 1 вся ветка
Текущий архив: 2007.03.04;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.031 c