2008-11-07 11 views
0

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

Я вызываю 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

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

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

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

С уважением, tamberg

 Смежные вопросы

  • Нет связанных вопросов^_^