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

Вниз

Принтер и миллиметры   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.03 c
1-1082553418
t_vic
2004-04-21 17:16
2004.04.11
Кнопочка в ячейке StringGrida


1-1082853146
val_5
2004-04-25 04:32
2004.04.11
препроцессорная переменная - где компил: D6 или D7


8-1071045370
типа я
2003-12-10 11:36
2004.04.11
Нет длльки OpenGL.dll


14-1079174367
Undert
2004-03-13 13:39
2004.04.11
Вопрос не в тему


14-1080142691
panov
2004-03-24 18:38
2004.04.11
Двадцатка самых популярных вопросов.