2008-11-07 10 views
0

J'ai une chaîne de texte multiligne (par exemple "Stuff \ nPlus Stuff \ nYet More Stuff"), et je veux la peindre, avec une image bitmap dans une info-bulle. Comme je peins l'image bitmap, je dois définir OwnerDraw sur true, ce que je fais. Je gère également l'événement Popup, donc je peux dimensionner l'info-bulle pour qu'elle soit assez grande pour contenir le texte et le bitmap.Alignement du texte sur l'infobulle de OwnerDraw en C#/.NET

J'appelle e.DrawBackground et e.DrawBorder(), puis peindre mon bitmap sur le côté gauche de la zone d'info-bulle.

Existe-t-il un ensemble de drapeaux que je peux passer à e.DrawText() pour aligner le texte à gauche, mais le décaler pour qu'il ne soit pas peint sur mon bitmap? Ou ai-je besoin de dessiner tout le texte sur mesure (ce qui impliquera probablement de scinder la chaîne sur les retours à la ligne, etc.)?

MISE À JOUR: Le code final ressemble à ceci:

private void _ItemTip_Draw(object sender, DrawToolTipEventArgs e) 
{ 
    e.DrawBackground(); 
    e.DrawBorder(); 

    // Reserve a square of size e.Bounds.Height x e.Bounds.Height 
    // for the image. Keep a margin around it so that it looks good. 
    int margin = 2; 
    Image i = _ItemTip.Tag as Image; 
    if (i != null) 
    { 
    int side = e.Bounds.Height - 2 * margin; 
    e.Graphics.DrawImage(i, new Rectangle(margin, margin, side, side)); 
    } 

    // Construct bounding rectangle for text (don't want to paint it over the image). 
    int textOffset = e.Bounds.Height + 2 * margin; 
    RectangleF rText = e.Bounds; 
    rText.Offset(textOffset, 0); 
    rText.Width -= textOffset; 

    e.Graphics.DrawString(e.ToolTipText, e.Font, Brushes.Black, rText); 
} 

Répondre

2

Je suppose que si vous définissez le rectangle de délimitation pour dessiner dans (calcul de l'image vous offset) vous pouvez simplement:

 RectangleF rect = new RectangleF(100,100,100,100); 
    e.Graphics.DrawString(myString, myFont, myBrush, rect); 
0

pour calculer la Hauteur d'une chaîne dessinée par un propriétaire s étant donné une certaine largeur w, nous utilisons le code suivant:

double MeasureStringHeight (Graphics g, string s, Font f, int w) { 
    double result = 0; 
    int n = s.Length; 
    int i = 0; 
    while (i < n) { 
     StringBuilder line = new StringBuilder(); 
     int iLineStart = i; 
     int iSpace = -1; 
     SizeF sLine = new SizeF(0, 0); 
     while ((i < n) && (sLine.Width <= w)) { 
      char ch = s[i]; 
      if ((ch == ' ') || (ch == '-')) { 
       iSpace = i; 
      } 
      line.Append(ch); 
      sLine = g.MeasureString(line.ToString(), f); 
      i++; 
     } 
     if (sLine.Width > w) { 
      if (iSpace >= 0) { 
       i = iSpace + 1; 
      } else { 
       i--; 
      } 
      // Assert(w > largest ch in line) 
     } 
     result += sLine.Height; 
    } 
    return result; 
} 

Cordialement, tamberg