1

我需要在自定义背景上绘制 RTF 文本。我正在使用一个扩展的 RichTextBox 控件,例如这里描述的来呈现 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 工作正常并正确绘制抗锯齿文本。

4

1 回答 1

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
}
于 2012-11-22T13:04:05.447 回答