使用EM_FORMATRANGE消息将RTF绘制到位图会生成带有丑陋黑色片段的文本

时间:2012-11-21 15:41:32

标签: c# cleartype

我需要在自定义背景上绘制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工作正常并正确绘制消除锯齿的文本。

1 个答案:

答案 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
}