|
<< Нажмите, чтобы показать Содержание >> Функция RV_GetPrinterDC [VCL и LCL] |
Возвращает контекст устройства, совместимый с текущим объектом принтера.
Модуль PtblRV.
Синтаксис
function RV_GetPrinterDC: HDC;
После использования этот контекст устройства необходимо удалить с помощью DeleteDC.
В качестве альтернативы можно использовать Printer.Handle.
Приведённая ниже процедура возвращает размер области документа на странице, преобразованный в «стандартные» пиксели. Область документа – это размер бумаги за вычетом полей.
Колонтитулы не учитываются.
procedure GetPageSize(RVPrint: TRVPrint; ARVStyle: TRVStyle;
out Width, Height: TRVPixelLength);
var
DC: HDC;
phoX, phoY, phW, phH, lpy, lpx, LM, TM, RM, BM: Integer;
begin
DC := RV_GetPrinterDC;
Width := GetDeviceCaps(DC, HORZRES);
Height := GetDeviceCaps(DC, VERTRES);
lpy := GetDeviceCaps(DC, LOGPIXELSY);
lpx := GetDeviceCaps(DC, LOGPIXELSX);
phoX := GetDeviceCaps(DC, PHYSICALOFFSETX);
phoY := GetDeviceCaps(DC, PHYSICALOFFSETY);
phW := GetDeviceCaps(DC, PHYSICALWIDTH);
phH := GetDeviceCaps(DC, PHYSICALHEIGHT);
LM := RV_UnitsToPixels(RVPrint.Margins.Left,
RVPrint.Units, lpx)- phoX;
TM := RV_UnitsToPixels(RVPrint.Margins.Top,
RVPrint.Units, lpy)- phoY;
RM := RV_UnitsToPixels(RVPrint.Margins.Right,
RVPrint.Units, lpx) - (phW - (phoX + Width));
BM := RV_UnitsToPixels(RVPrint.Margins.Bottom,
RVPrint.Units, lpy) - (phH - (phoY + Height));
if RVPrint.FixMarginsMode=rvfmmAutoCorrect then
begin
if LM<0 then
begin
inc(RM, LM);
LM := 0;
end;
if TM<0 then
begin
inc(BM, TM);
TM := 0;
end;
if RM<0 then
RM := 0;
if BM<0 then
BM := 0;
end;
dec(Width, LM+RM);
dec(Height, TM+BM);
DeleteDC(DC);
Width := MulDiv(Width, ARVStyle.UnitsPixelsPerInch, lpx);
Height := MulDiv(Height, ARVStyle.UnitsPixelsPerInch, lpy);
end;
Пример использования (создание документа, имеющего ширину страницы; учитывается различие в плотности пикселей):
var w, h: TRVPixelLength;
// опция rvoClientTextWidth должна быть исключена
// из RichViewEdit1.Options.
GetPageSize(RVPrint1, w,h);
RichViewEdit1.MaxTextWidth :=
w - RichViewEdit1.LeftMargin - RichViewEdit1.RightMargin;
RichViewEdit1.MinTextWidth := RichViewEdit1.MaxTextWidth;
RichViewEdit1.Format;