【问题标题】:Printing a richedit with background colour打印带有背景颜色的richedit
【发布时间】:2012-02-28 22:57:12
【问题描述】:

我正在将文本从 delphi TRichedit 控件输出到打印机。有一个背景图片,所以我用这个逻辑使用 EM_FORMATRANGE ...

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

... 并且工作正常,除了在呈现文本时它始终具有白色背景,而不管 Richedit 的颜色如何。知道为什么吗?

编辑:来自发表的评论:

RangeRANGEFORMAT,并被赋予如下值:

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;

【问题讨论】:

  • 什么是Range?根据MSDN,它是FORMATRANGE,但您没有向我们提供有关您实际作为该参数传递的内容的信息。如果您不告诉我们您在做什么,就很难说出可能出了什么问题。 :)
  • @KenWhite 是的,它是一个 FORMATRANGE,除了 RichEdit 的背景颜色没有通过之外,它都可以正常工作。在任何情况下,该范围仅指定句柄和位置信息。一种可能的解决方案是使用 0 作为第二个参数,以便它只测量,然后绘制该大小的填充矩形,然后在顶部透明地绘制文本,但这似乎是用大锤敲碎坚果......
  • 再次声明,您没有向我们提供了关于您作为Range 内容提供的内容的信息。 “请帮帮我。我不会确切地告诉你我在做什么,但它不起作用。”很难提供帮助。 “我在 FORMATRANGE 中传递了一些东西(但我不会告诉你什么,所以你可以看看它是否正确),但它不起作用。有什么问题?”也是如此。
  • @KenWhite 好的,既然你问... 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; // 一些大数字 Range.rcPage := Range.rc; Range.chrg.cpMin := 0; Range.chrg.cpMax := -1;
  • 我可以完全控制位置、字体、对齐方式、大小等。甚至透明度。唯一的问题是无论richedit的颜色如何,背景总是呈现为白色(上面代码中的're'我在原始问题中更改为'myrichedit')。

标签: delphi richedit trichedit


【解决方案1】:

我发现一个解决方案是您可以使用代码设置单个字符的背景(在将文本添加到 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 2011-01-24
    • 1970-01-01
    • 2010-10-24
    • 2016-01-29
    • 2011-04-23
    相关资源
    最近更新 更多