Domanda

Ho una stringa di testo multilinea (ad es. " Stuff \ nPiù Stuff \ nEppure più roba "), e voglio dipingerla, insieme a una bitmap in una descrizione comandi. Dal momento che sto dipingendo la bitmap, devo impostare OwnerDraw su true, cosa che sto facendo. Sto anche gestendo l'evento Popup, quindi posso ridimensionare la descrizione comandi in modo che sia sufficientemente grande da contenere il testo e la bitmap.

Chiamo e.DrawBackground ed e.DrawBorder (), quindi dipingo la mia bitmap sul lato sinistro dell'area della descrizione comandi.

Esiste una serie di flag che posso passare a e.DrawText () per allineare a sinistra il testo, ma per spostarlo in modo che non venga dipinto sulla mia bitmap? O devo disegnare anche tutto il testo personalizzato (che probabilmente comporterà la divisione della stringa su newline, ecc.)

AGGIORNATO: il codice finale è simile al seguente:

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);
}
È stato utile?

Soluzione

Suppongo che se definisci il rettangolo di delimitazione da disegnare (calcolando l'offset dell'immagine da solo) potresti semplicemente:

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

Altri suggerimenti

per calcolare l'altezza di una stringa disegnata dal proprietario s data una certa larghezza w, usiamo il seguente codice:

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

Saluti, Tamberg

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top