Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
ВнизПринтер и миллиметры Найти похожие ветки
← →
555ААА555 (2004-03-22 20:12) [0]Вопрос таков:
Есть задание для печати
нужно вывести на печать некую строку
на принтере: Printer.Canvas.TextOut(X, Y,"Строка");
Чтобы строка была 57 мм сверху и 72 мм слева от
верхнего левого угла листа.
57 мм и 72 мм могут конечно же менятся.
Как расчитывать X,Y? т.е. переводить
миллеметры в пикселы.
← →
KSergey © (2004-03-22 21:06) [1]см. SetMapMode
← →
dmk © (2004-03-22 21:33) [2]mm := PixelWidth / PrinterResolution * 25.4;
px := PhysWidthMM * PrinterResolution / 25.4;
← →
dmk © (2004-03-22 21:50) [3]Плюс еще надо учесть технические поля принтера.
← →
555ААА555 (2004-03-22 21:59) [4]Спасибо!
Будем пробовать.
(mm := PixelWidth / PrinterResolution * 25.4; //???? mm - миллиметры?
px := PhysWidthMM * PrinterResolution / 25.4; //????
- прокомментировать можно?).
← →
555ААА555 (2004-03-22 23:11) [5]dmk,
Извеняюсь, можно поподробнее?
← →
XYMM (2004-03-22 23:22) [6]PixelWidth - ???????????
PhysWidthMM - ???????????
← →
dmk © (2004-03-22 23:43) [7]Размер в милиметрах := (Дистанция(размер) в пикселах) /
(Разрешение принтера в точках на дюйм) * Дюйм(25.4 мм)
(mm := PixelWidth / PrinterResolution * 25.4;)
Размер в пикселях := (Физические размеры в мм) *
(Разрешение принтера в точках на дюйм) / Дюйм(25.4 мм);
(px := PhysWidthMM * PrinterResolution / 25.4;)
← →
555ААА555 (2004-03-23 00:39) [8]Как программно узнать/установить разрешение
принтера в точках на дюйм?
← →
dmk © (2004-03-23 01:29) [9]Type LPrinterInfo = record
PrinterName: PChar; //Íàçâàíèå ïðèíòåðà
PortName: PChar; //Íàçâàíèå ïîðòà
px_PhysWidth: Integer; //Øèðèíà ñòðàíèöû â ïèêñåëàõ
px_PhysHeight: Integer; //Âûñîòà ñòðàíèöû â ïèêñåëàõ
mm_PhysWidth: Extended; //Øèðèíà ñòðàíèöû â ìì.
mm_PhysHeight: Extended; //Âûñîòà ñòðàíèöû â ìì.
px_PaWidth: Integer; //Øèðèíà ïå÷àòíîãî ïîëÿ â ïèêñåëàõ.
px_PaHeight: Integer; //Âûñîòà ïå÷àòíîãî ïîëÿ â ïèêñåëàõ.
mm_PaWidth: Extended; //Øèðèíà ïå÷àòíîãî ïîëÿ â ìì.
mm_PaHeight: Extended; //Âûñîòà ïå÷àòíîãî ïîëÿ â ìì.
px_PhysOffsetX: Integer; //Ñìåùåíèå ãðàíèöû ïå÷àòíîãî ïîëÿ
px_PhysOffsetY: Integer; //Ñìåùåíèå ãðàíèöû ïå÷àòíîãî ïîëÿ
ColorDepth: Integer; //Ãëóáèíà öâåòà ïðèíòåðà
Resolution: Integer; //Ðàçðåøåíèå ïðèíòåðà
DevMode: TDeviceMode; //Òåêóùèå íàñòðîéêè ñòðàíèöû
end;
Function TWinPrinter.GetWinPrinterInfo:LPrinterInfo;
var
PrinterDC: HDC;
begin
//Î÷èñòèì ñòðóêòóðó
FillChar(Result, SizeOf(LPrinterInfo), 0);
//Ñîçäàäèì êîíòåêñò ïðèíòåðà
PrinterDC := CreateIC(nil, PChar(FPrnName), nil, PDeviceModeA(@FDevMode^));
With Result do
begin
//Íàçâàíèå óñòðîéñòâà
PrinterName := PChar(FPrnName);
//Íàçâàíèå ïîðòà
PortName := PChar(FPortName);
//Ðàçðåøåíèå ïðèíòåðà
Resolution := FDevMode.dmPrintQuality;
//Ëîãè÷åñêèå ðàçìåðû áóìàãè â ïèêñåëàõ
px_PhysWidth := GetDeviceCaps(PrinterDC, PHYSICALWIDTH);
px_PhysHeight := GetDeviceCaps(PrinterDC, PHYSICALHEIGHT);
//Ôèçè÷åñêèå ðàçìåðû áóìàãè â ìì.
mm_PhysWidth := GetSizeInMM(px_PhysWidth, Resolution);
mm_PhysHeight := GetSizeInMM(px_PhysHeight, Resolution);
//Ëîãè÷åñêèå ðàçìåðû ïå÷àòíîãî ïîëÿ â ïèêñåëàõ
px_PaWidth := GetDeviceCaps(PrinterDC, HORZRES);
px_PaHeight := GetDeviceCaps(PrinterDC, VERTRES);
//Ôèçè÷åñêèå ðàçìåðû ïå÷àòíîãî ïîëÿ â ìì.
mm_PaWidth := GetSizeInMM(px_PaWidth, Resolution);
mm_PaHeight := GetSizeInMM(px_PaHeight, Resolution);
//Ñìåùåíèå ëåâîãî âåðõíåãî êðàÿ êîíòåêñòà ïðèíòåðà
//îò êðàÿ áóìàãè
px_PhysOffsetX := GetDeviceCaps(PrinterDC, PHYSICALOFFSETX);
px_PhysOffsetY := GetDeviceCaps(PrinterDC, PHYSICALOFFSETY);
//Ãëóáèíà öâåòà èñïîëüçóåìàÿ äëÿ ïå÷àòè
ColorDepth := GetDeviceCaps(PrinterDC, BITSPIXEL);
//DevMode ñòðóêòóðà
DevMode := FDevMode^;
end;//With
TechnologyStr(PrinterDC, FTechStr);
//Óäàëèì êîíòåêñò
Windows.DeleteDC(PrinterDC);
end;
SetPrinter - для установки данных
← →
Broot (2004-03-23 03:55) [10]Фигня это все
пишеш 2 функции перевода мм в пикселы:
function MmToPixX(const mm: double): integer;
begin
Result := Round(mm / 25.4 * kX);
end;
function MmToPixY(const mm: double): integer;
begin
Result := Round(mm / 25.4 * kY);
end;
коэффициенты определяются так:
with Printer do
begin
kX := GetDeviceCaps(Handle, LOGPIXELSX);
kY := GetDeviceCaps(Handle, LOGPIXELSY);
dY := GetDeviceCaps(Handle,PHYSICALOFFSETY); //смещение от начала страницы
dX := GetDeviceCaps(Handle,PHYSICALOFFSETX); //
end;
соответственно если считаешь от угла страницы, то формула преобразуется:
X := Round(mm / 25.4 * kX - dX)
либо, теряя некоторую точность:
X := MmToPixX(mm) - Round(dX);
← →
555ААА555 (2004-03-23 21:06) [11]Broot СПАСИБО!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.039 c