powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Printer
21 сообщений из 21, страница 1 из 1
Printer
    #32272622
Фотография GroZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Почему принтер печатает в ОЧЕНЬ маленьком масштабе?
Нужно как-то указать Printer-у нормальный масштаб, но как? ... через какие проперти?

Код: plaintext
1.
2.
3.
   Printer.BeginDoc;
   Panel1.PaintTo(Printer.Handle,  0 ,  0 );
   Printer.EndDoc;


Помогите плиз.
...
Рейтинг: 0 / 0
Printer
    #32272644
zDIV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что PaintTo рисует попиксельно.
Хорошее начало - разобраться с кодом TCustomForm.Print.
...
Рейтинг: 0 / 0
Printer
    #32272657
Фотография GroZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
разбирался....
TCustomForm.Print как раз попиксельно и печатает ... что меня не устраивает.

Я же если даже делаю что-то вроде

Printer.BeginDoc;
Rectangle(Printer.Handle, 0, 0, 100, 100);
Printer.EndDoc;

всё равно очень мелко печатает ...
нужно как-то задать масштаб принтеру ... как?
...
Рейтинг: 0 / 0
Printer
    #32272727
zDIV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я помню (сейчас посмотрю) - три варианта вывода там, один из которых попиксельно... но самое интересное - это функция StretchDIBits, она практически гарантирует отрисовку при печати, поскольку
Printer.CopyRect(Rect(x1, y1, x2, y2), Panel1.Canvas, Panel1.Canvas.ClipRect),
где x1, y1, x2, y2 (куда печатать) все-таки придется посчитать самому, исходя из текущего разрешения принтера и нужных размеров на бумаге, - так вот такое прокатывает далеко не всегда, на экране, пожалуйста, а на принтер - не всякий драйвер позволяет такое.
...
Рейтинг: 0 / 0
Printer
    #32272816
Фотография GroZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но это ведь опять таки попиксельная прорисовка!?
кто нибудь знает как сделать Printer.TextOut( ... ); чтоб нормально печатало?
...
Рейтинг: 0 / 0
Printer
    #32273242
Фотография GroZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неужели ни у кого не было подобной проблемы?
...
Рейтинг: 0 / 0
Printer
    #32273268
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну была.

Я в свойствах принтера узнавал Rect - область печати.
Затем StrechDraw выводил пропорционально этой области.
Поскольку это в относительном виде, а не абсолютном, то печатается так как задумано, в половину листа, в четверть или с любым другим масштабом.

Конкретный алгоритм на вскидку привести не могу - не помню тонкостей.
...
Рейтинг: 0 / 0
Printer
    #32273275
Малиновский Владимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да вот лентяи все - генераторы отчетов используем...
- попробуй
.ChangeScale
- или используй класс TMetaFile - там размеры ив пикселях, и в метрах указывать можно.
...
Рейтинг: 0 / 0
Printer
    #32273287
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Размеры в пикселях, метрах, миллиметрах... в любой канве (Canvas) использовать можно. На экране, окне, форме, принтере... в любом DC.
...
Рейтинг: 0 / 0
Printer
    #32273296
Фотография GroZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Малиновский Владимир: чем мне может помочь ChangeScale?

Zmeishe, Малиновский Владимир:
Кому указать эти размеры? у TPrinter есть только пропети Printer.PageHeight и Printer.PageWidth и те ReadOnly.
...
Рейтинг: 0 / 0
Printer
    #32273302
Малиновский Владимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все, домой пойду.
...
Рейтинг: 0 / 0
Printer
    #32273303
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эти проперти служат отправной точкой для расчёта масштаба и размеров прямоугольника в который хочешь вывести изображение.
Этот расчитанный прямоугольник передаёшь в функцию StrechDraw.
...
Рейтинг: 0 / 0
Printer
    #32273312
Фотография GroZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ты наверно имееш ввиду StretchDIBits ... но с её изображение получается попиксельным. (т.е. качество текста очень плохое) ... Word явно не эту функцию использует ... :(
...
Рейтинг: 0 / 0
Printer
    #32273314
Малиновский Владимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... метафайл
...
Рейтинг: 0 / 0
Printer
    #32273320
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имею ввиду
void __fastcall StretchDraw(const TRect &Rect, TGraphic* Graphic);
она в любой канве есть, в том числе и в канве принтера

TPrinter->Canvas->StretchDraw(const TRect &Rect, TGraphic* Graphic);

Я из BLOB полей базы данных jpeg-и таскал и на принтере растягивал или ужимал в любом масштабе от спичечной этикетки до хрен знает скольки.
...
Рейтинг: 0 / 0
Printer
    #32273334
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я когда-то давно столкнулся с проблемой вывода текста.
Решалось это либо переключеним системы координат принтера, по моему в TWIPS, либо созданием TBitmap, выводом текста в эту bitmap, затем её печать через StretchDraw т.е. с растягиванием или ужиманием.
...
Рейтинг: 0 / 0
Printer
    #32273601
zDIV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какую-бы Stretch не использовать (или "коэффициенты масштабирования") - все одно, текст будет грубо натянут, не так поступает Word... По-хорошему, нужно отрисовку на экране (я, например, облюбовал TImage) и на принтере делать одним и тем-же кодом вручную, ориентируясь на нужные метрические размеры и текущее разрешение канвы
DrawWhole(Canvas..., PixelsPerSm...) или
DrawPart(Canvas..., PixelsPerSm..., HorzShiftSm, VertShiftSm...)
...
Рейтинг: 0 / 0
Printer
    #32273641
zDIV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. вся картинка должна быть известна в см, например, а при отрисовке все пересчитывать в пикселы, тогда будет как в Ворде...
...
Рейтинг: 0 / 0
Printer
    #32273648
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наконец-то я нарыл в старых записях.
Есть такая API функция. Попробуй установить режим DC принтера MM_TEXT

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
The SetMapMode function sets the mapping mode of the specified device context. The mapping mode defines the unit of measure used to transform page-space units into device-space units, and also defines the orientation of the device's x and y axes. 

int SetMapMode(

    HDC hdc,	// handle of device context 
    int fnMapMode 	// new mapping mode 
   );	
 

Parameters

hdc

Identifies the device context. 

fnMapMode

Specifies the new mapping mode. It can be any one of the following values: 

Value	Description
MM_ANISOTROPIC	Logical units are mapped to arbitrary units with arbitrarily scaled axes. Use the SetWindowExtEx and SetViewportExtEx functions to specify the units, orientation, and scaling that you want.
MM_HIENGLISH	Each logical unit is mapped to 0.001 inch. Positive x is to the right; positive y is up.
MM_HIMETRIC	Each logical unit is mapped to 0.01 millimeter. Positive x is to the right; positive y is up.
MM_ISOTROPIC	Logical units are mapped to arbitrary units with equally scaled axes; that is, one unit along the x-axis is equal to one unit along the y-axis. Use the SetWindowExtEx and SetViewportExtEx functions to specify the units and the orientation of the axes that you want. Graphics device interface (GDI) makes adjustments as necessary to ensure the x and y units remain the same size (for example, if you set the window extent, the viewport will be adjusted to keep the units isotropic).
MM_LOENGLISH	Each logical unit is mapped to 0.01 inch. Positive x is to the right; positive y is up.
MM_LOMETRIC	Each logical unit is mapped to 0.1 millimeter. Positive x is to the right; positive y is up.
MM_TEXT	Each logical unit is mapped to one device pixel. Positive x is to the right; positive y is down.
MM_TWIPS	Each logical unit is mapped to one twentieth of a printer's point ( 1 / 1440  inch, also called a  "twip" ). Positive x is to the right; positive y is up.
 

Return Values

If the function succeeds, the return value identifies the previous mapping mode.
If the function fails, the return value is zero. 

Remarks

The MM_TEXT mode allows applications to work in device pixels, whose size varies from device to device. 
The MM_HIENGLISH, MM_HIMETRIC, MM_LOENGLISH, MM_LOMETRIC, and MM_TWIPS modes are useful for applications drawing in physically meaningful units (such as inches or millimeters). 
The MM_ISOTROPIC mode ensures a  1 : 1  aspect ratio. 
The MM_ANISOTROPIC mode allows the x-coordinates and y-coordinates to be adjusted independently. 
...
Рейтинг: 0 / 0
Printer
    #32274959
Фотография GroZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zmeishe, по смыслу вроде то что мне нужно, но реально НОЛЬ эффэкта. то есть не работает почемуто :(

попробывал и
SetMapMode(Printer.Handle, MM_TEXT)
и
SetViewportExtEx(Printer.Handle, 10, 10, @ts)
и
SetWindowExtEx(Printer.Handle, 10, 10, @ts)

всё одно, ничего не помогает :(
...
Рейтинг: 0 / 0
Printer
    #32275307
LAlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если это поможет, то вот (только код на С++).

У меня была форма, на которой сидел TChart и его я печатал на почти полный лист так:

if(!DlgPrint->Execute())
return;
TColor BrColor;
float k=0.857*min(Printer()->PageWidth/Chart->Width,Printer()->PageHeight/Chart->Height);
TRect Rect=TRect(0.5*(Printer()->PageWidth-Chart->Width*k),
0.5*(Printer()->PageHeight-Chart->Height*k),
0.5*(Printer()->PageWidth+Chart->Width*k),
0.5*(Printer()->PageHeight+Chart->Height*k));
Printer()->BeginDoc();
BrColor=Printer()->Canvas->Brush->Color;
Printer()->Canvas->Brush->Color=Chart->Color;
Printer()->Canvas->FillRect(Rect);
Printer()->Canvas->Brush->Color=BrColor;
Chart->PrintPartialCanvas(Printer()->Canvas,Rect);
Printer()->EndDoc();
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Printer
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]