Выравнивание текста в подсказке OwnerDraw в C # / .NET - PullRequest
0 голосов
/ 07 ноября 2008

У меня есть многострочная текстовая строка (например, «Stuff \ nMore Stuff \ nYet More Stuff»), и я хочу нарисовать ее вместе с растровым изображением во всплывающей подсказке. Так как я рисую растровое изображение, мне нужно установить для OwnerDraw значение true, что я и делаю. Я также обрабатываю событие Popup, поэтому я могу изменить размер всплывающей подсказки так, чтобы он содержал текст и растровое изображение.

Я вызываю e.DrawBackground и e.DrawBorder (), а затем рисую свое растровое изображение в левой части области всплывающей подсказки.

Есть ли набор флагов, которые я могу передать e.DrawText (), чтобы выровнять текст по левому краю, но сместить его так, чтобы он не закрашивался на моем растровом изображении? Или мне нужно также отрисовать весь текст (что, вероятно, потребует разбиения строки на новые строки и т. Д.)?

ОБНОВЛЕНО: окончательный код выглядит так:

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

Ответы [ 2 ]

2 голосов
/ 07 ноября 2008

Я предполагаю, что если вы определяете ограничивающий прямоугольник для рисования (вычисляя смещение изображения самостоятельно), вы можете просто:

     RectangleF rect = new RectangleF(100,100,100,100);
     e.Graphics.DrawString(myString, myFont, myBrush, rect);
0 голосов
/ 07 ноября 2008

для вычисления высоты нарисованной строки s владельца с определенной шириной w, мы используем следующий код:

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

С уважением, Тамберг

...