Выравнивание текста во всплывающей подсказке OwnerDraw в C # / .NET

StackOverflow https://stackoverflow.com/questions/271464

Вопрос

У меня есть многострочная текстовая строка (например,"Материал, еще больше материала, еще больше материала"), и я хочу нарисовать его вместе с растровым изображением во всплывающей подсказке.Поскольку я рисую растровое изображение, мне нужно установить для OwnerDraw значение true, что я и делаю.Я также обрабатываю всплывающее событие, поэтому могу сделать всплывающую подсказку достаточно большой, чтобы вместить текст и растровое изображение.

Я вызываю 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);
}
Это было полезно?

Решение

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

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

Другие советы

чтобы вычислить высоту нарисованной владельцем строки 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;
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top