我需要在自定义背景上绘制RTF文本。我正在使用扩展的RichTextBox控件,如示例here所述,以呈现RTF本身。如果图形与屏幕关联,这可以正常工作。但是,当我使用从位图创建的图形时,cleartype字体有丑陋的黑色片段,如抗锯齿,不会正确地将文本与背景混合(我首先绘制背景)。这是什么原因?它可以以某种方式修复吗?
生成丑陋位图的代码示例:
private void CreateBitmap(string rtf, Rectangle bitmapRectangle)
{
using (Bitmap bitmap = new Bitmap(bitmapRectangle.Width, bitmapRectangle.Height))
{
using (Graphics gr = Graphics.FromImage(bitmap))
{
gr.Clear(Color.Yellow);
// extended RichTextBox control from www.andrewvos.com
RichTextBoxDrawer rtbDrawer = new RichTextBoxDrawer();
rtbDrawer.Rtf = rtf;
rtbDrawer.Draw(gr, bitmapRectangle);
bitmap.Save(@"c:\bitmap.png");
}
}
}
还有一件事:Graphics.DrawString工作正常并正确绘制消除锯齿的文本。
答案 0 :(得分:1)
好吧,看起来我在错误的地方画背景。如果我在从设备上下文句柄创建的图形上绘制背景,这是在RichTextBoxDrawer.Draw方法中发送的EM_FORMATRANGE消息,那么文本将正确呈现:
public void Draw(Graphics graphics, Rectangle layoutArea, Bitmap background = null)
{
//Calculate the area to render.
SafeNativeMethods.RECT rectLayoutArea;
rectLayoutArea.Top = (int)(layoutArea.Top * anInch);
rectLayoutArea.Bottom = (int)(layoutArea.Bottom * anInch);
rectLayoutArea.Left = (int)(layoutArea.Left * anInch);
rectLayoutArea.Right = (int)(layoutArea.Right * anInch);
IntPtr hdc = graphics.GetHdc();
using (Graphics backgroundGraphics = Graphics.FromHdc(hdc))
{
// draw some background
backgroundGraphics.Clear(Color.Yellow);
}
// rest of the method is same
}