2012-11-21 44 views
1

我需要在自定義背景上繪製RTF文本。我正在使用例如here所述的擴展RichTextBox控件來呈現RTF本身。如果圖形與屏幕相關聯,這可以正常工作。但是,當我使用從位圖創建的圖形時,cleartype字體具有醜陋的黑色片段,如抗鋸齒不會將文本與背景正確混合(我首先繪製背景)。這是什麼原因?它可以以某種方式修復?使用EM_FORMATRANGE消息將RTF繪製到位圖會生成帶有醜陋黑色碎片的文本

的代碼生成一個醜陋的位圖示例:

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

除了相當複雜的方式繪製背景之外,我還嘗試了簡單的Graphics.FillRectangle或Graphics.Clear,但結果始終相同。這些方法是否足以正確初始化位圖? – user1842413

回答

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 
}