سؤال

ولدي سلسلة نص متعدد الأسطر (على سبيل المثال "الاشياء \ n المزيد السخافات \ nYet المزيد من السخافات")، وأريد أن رسمه، جنبا إلى جنب مع صورة نقطية في تلميح الأدوات. وبما أنني اللوحة نقطية، ولست بحاجة لوضع OwnerDraw إلى true، الذي أقوم به. أنا أيضا التعامل مع الحدث قافزة، حتى أستطيع أن حجم تلميح الأدوات إلى أن تكون كبيرة بما يكفي لاحتواء النص والصورة النقطية.

وأنا أدعو e.DrawBackground وe.DrawBorder ()، ومن ثم رسم بلدي نقطية على الجانب الأيسر من منطقة تلميح الأدوات.

هل هناك مجموعة من الأعلام I يمكن أن تمر إلى 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);

نصائح أخرى

ولحساب الطول من سلسلة صاحب تعادل ق إعطاء عرض معين ث، ونحن نستخدم التعليمة البرمجية التالية:

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top