Печать richedit с цветом фона - PullRequest
       34

Печать richedit с цветом фона

4 голосов
/ 29 февраля 2012

Я выводю текст из элемента управления delphi TRichedit на принтер.Имеется фоновое изображение, поэтому я использую EM_FORMATRANGE с этой логикой ...

myrichedit.Perform(EM_FORMATRANGE, 1, Longint(@Range));

... и это прекрасно работает, за исключением того, что при визуализации текста он всегда имеет белый фон независимо отцвет richedit.Любая идея, почему?

РЕДАКТИРОВАТЬ: Из опубликованного комментария:

Range является RANGEFORMAT, и ему присваиваются следующие значения:

Range.hdc := aCanvas.Handle; 
Range.hdcTarget := aCanvas.Handle; 
LogX := GetDeviceCaps(Range.hdc, LOGPIXELSX); 
LogY := GetDeviceCaps(Range.hdc, LOGPIXELSY); 
Range.rc.Left := x * 1440 div LogX; 
Range.rc.Right := (x+re.ClientWidth) * 1440 div LogX; // (1440=twips/inch)
Range.rc.Top := y * 1440 div LogY; 
Range.rc.Bottom := 5000 * 1440 div LogY; // Some bigish number 
Range.rcPage := Range.rc; 
Range.chrg.cpMin := 0; 
Range.chrg.cpMax := -1;

1 Ответ

0 голосов
/ 01 марта 2012

Я обнаружил, что решение этой проблемы состоит в том, что вы можете установить фон отдельных символов с помощью кода (перед добавлением текста в richedit) ...

var
  Format: CHARFORMAT2;
begin
...
 myrichedit.SelStart:=myrichedit.GetTextLen;
 FillChar(Format, SizeOf(Format), 0);
 with Format do begin
     cbSize := SizeOf(Format);
     dwMask := CFM_BACKCOLOR;
     crBackColor := charbackgroundcolor;
     myrichedit.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Longint(@Format));
 end;
 myrichedit.SetText:='Hello';

... но чтобы получить цвет фона для всего блока текста, сделайте это, чтобы нарисовать текст ...

var
  size : Tsize;
  Range: TFormatRange;
  Rect: TRect;
  LogX, LogY : Integer;
  bm : tbitmap;
  aCanvas : TCanvas;
  ExStyle: DWord;
begin
  aCanvas:=Printer.Canvas;

  Range.hdc := aCanvas.Handle;
  Range.hdcTarget := aCanvas.Handle;

  LogX := GetDeviceCaps(Range.hdc, LOGPIXELSX);
  LogY := GetDeviceCaps(Range.hdc, LOGPIXELSY);

  Range.rc.Left := x * 1440 div LogX;
  Range.rc.Right := (x+myrichedit.ClientWidth) * 1440 div LogX; // (1440=twips/inch)
  Range.rc.Top := y * 1440 div LogY;
  Range.rc.Bottom := 5000 * 1440 div LogY; // Some bigish number
  Range.rcPage := Range.rc;
  Range.chrg.cpMin := 0;
  Range.chrg.cpMax := -1;  
  myrichedit.Perform(EM_FORMATRANGE, 0, Longint(@Range)); // Measure the formatted text
  rect:=Range.rc;
  rect.Left:=Range.rc.Left * LogX div 1440;
  rect.Top:=Range.rc.Top * LogY div 1440;
  rect.Right:=Range.rc.Right * LogX div 1440;
  rect.Bottom:=Range.rc.Bottom * LogY div 1440;
  acanvas.Brush.Color:=myblockcolor;
  acanvas.FillRect(rect); // Fill the background rectangle

  ExStyle := GetWindowLong(re.Handle, GWL_EXSTYLE); // Draw richedit transparently over coloured area
  ExStyle := ExStyle or WS_EX_TRANSPARENT;
  SetWindowLong(re.Handle, GWL_EXSTYLE, ExStyle);
  myrichedit.Perform(EM_FORMATRANGE, 1, Longint(@Range));  
end;
...