Frage

Ich habe einen mehrzeiligen Textzeichenfolge (zum Beispiel „Stuff \ nMehr Stuff \ NYET Mehr Stuff“), und ich möchte es malen, zusammen mit einem Bitmap in ein Tooltip. Da ich die Bitmap bin Malerei, ich brauche OwnerDraw auf true zu setzen, was ich tue. Ich bin auch das Popup-Event-Handling, also kann ich Größe der Tooltip groß genug sein, um den Text und die Bitmap zu halten.

Ich rufe e.DrawBackground und e.DrawBorder () und dann Bereich Malerei meine Bitmap auf der linken Seite des Tooltip.

Gibt es eine Reihe von Flaggen ich e.DrawText (), um passieren zu linksbündig auszurichten, den Text, aber es versetzt, so dass sie nicht über meine Bitmap gemalt bekommen? Oder muss ich individuelle als auch den gesamten Text ziehen (was wahrscheinlich beinhalten wird die Zeichenfolge auf Zeilenumbrüche Spaltung usw.)?

AKTUALISIERT: Der letzte Code sieht wie folgt aus:

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);
}
War es hilfreich?

Lösung

Ich gehe davon aus, dass, wenn Sie das Begrenzungsrechteck definieren zu ziehen in (Berechnung der Bildversatz selbst) konnte man nur:

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

Andere Tipps

, um die Höhe eines Besitzers gezeichnet Zeichenfolge berechnen s gegeben eine bestimmte Breite w, verwenden wir den folgenden Code ein:

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

Viele Grüße, Tamberg

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top