2012-11-21 5 views
1

Je dois dessiner un texte RTF sur un arrière-plan personnalisé. J'utilise un contrôle RichTextBox étendu comme décrit par exemple here pour rendre le RTF lui-même. Cela fonctionne très bien si les graphiques sont associés à l'écran. Mais quand j'utilise des graphiques créés à partir d'un bitmap, les polices cleartype ont des fragments noirs horribles comme l'anti-crénelage ne mélange pas correctement le texte avec l'arrière-plan (je dessine l'arrière-plan en premier). Quelle est la raison de cela? Et peut-il être réparé?Dessiner RTF en bitmap à l'aide du message EM_FORMATRANGE produit du texte avec des fragments noirs moche

Exemple de code de la production d'un bitmap laid:

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"); 
     } 
    } 
} 

une chose: Graphics.DrawString fonctionne très bien et à faire correctement le texte anti-aliasé.

+1

C'est invariablement un effet secondaire de ne pas initialiser le bitmap correctement. "Je dessine l'arrière-plan en premier" n'est pas une preuve suffisante que vous l'avez fait correctement, vous devez poster un extrait. –

+0

Mis à part la manière assez compliquée que je dessine l'arrière-plan j'ai essayé aussi simple Graphics.FillRectangle ou Graphics.Clear, mais le résultat était toujours le même. Ces méthodes sont-elles suffisantes pour initialiser correctement le bitmap? – user1842413

Répondre

1

Ok, il semblerait que je dessine l'arrière-plan au mauvais endroit. Si je dessine l'arrière-plan sur un graphique créé à partir d'une poignée de contexte de dispositif auquel le message EM_FORMATRANGE envoyé dans la méthode RichTextBoxDrawer.Draw, le texte est rendu correctement:

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 
} 
Questions connexes