【发布时间】:2012-02-28 22:57:12
【问题描述】:
我正在将文本从 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;
【问题讨论】:
-
什么是
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')。