Pregunta

Tengo una cadena de texto de varias líneas (p. ej., "Cosas \ nMás cosas \ nSin más cosas"), y quiero pintarla, junto con un mapa de bits en la información sobre herramientas. Como estoy pintando el mapa de bits, necesito establecer OwnerDraw en true, lo que estoy haciendo. También estoy manejando el evento emergente, por lo que puedo cambiar el tamaño de la información sobre herramientas para que sea lo suficientemente grande como para contener el texto y el mapa de bits.

Llamo a e.DrawBackground y e.DrawBorder (), y luego pinto mi mapa de bits en el lado izquierdo del área de información sobre herramientas.

¿Hay un conjunto de banderas que pueda pasar a e.DrawText () para alinear a la izquierda el texto, pero para compensarlo de modo que no quede pintado sobre mi mapa de bits? ¿O necesito dibujar también todo el texto de forma personalizada (lo que probablemente implicará dividir la cadena en líneas nuevas, etc.)?

ACTUALIZADO: El código final se ve así:

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);
}
¿Fue útil?

Solución

Supongo que si define el rectángulo delimitador para dibujar (calculando el desplazamiento de la imagen usted mismo) podría simplemente:

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

Otros consejos

para calcular la Altura de una cadena dibujada por el propietario con un ancho determinado w, usamos el siguiente código:

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

Saludos, tamberg

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top