Question

J'ai une chaîne de texte multiligne (par exemple, "Stuff \ nPlus de Stuff \ nYet More Stuff"), et je souhaite la peindre, ainsi qu'une image bitmap dans une info-bulle. Puisque je peins le bitmap, je dois définir OwnerDraw sur true, ce que je suis en train de faire. Je gère également l'événement Popup. Je peux donc dimensionner l'info-bulle pour qu'elle soit suffisamment grande pour contenir le texte et le bitmap.

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

Existe-t-il un ensemble d'indicateurs que je peux transmettre à e.DrawText () afin d'aligner le texte à gauche, mais de le décaler de manière à ce qu'il ne soit pas peint sur mon bitmap? Ou dois-je également personnaliser tout le texte (ce qui implique probablement le fractionnement de la chaîne sur les nouvelles lignes, 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);
}
Était-ce utile?

La solution

Je suppose que si vous définissez le rectangle de délimitation à dessiner (en calculant le décalage d'image vous-même), vous pouvez simplement:

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

Autres conseils

pour calculer la hauteur d'une chaîne dessinée par le 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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top