Функция RV_GetPrinterDC [VCL и LCL]

<< Нажмите, чтобы показать Содержание >>

Функция 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;