سؤال

أنا باستخدام .NETCF (ويندوز موبايل) Graphics فئة DrawString() طريقة لجعل حرف واحد على الشاشة.

المشكلة هي أنني لا يمكن أن يبدو للحصول على أنها تركز بشكل صحيح.بغض النظر عن ما كنت تعيين Y إحداثيات موقع سلسلة تجعل دائما يخرج أقل من ذلك و أكبر حجم النص أكبر Y تعويض.

على سبيل المثال ، في النص حجم 12 ، الإزاحة حوالي 4 ، ولكن في 32 تعويض عن 10.

أريد الحرف عموديا يستغرق أكثر من المستطيل يجري رسمها في أن تركز أفقيا.هنا هو بلدي التعليمات البرمجية الأساسية. this يتم الرجوع للمستخدم التحكم يتم رسمها.

Graphics g = this.CreateGraphics();

float padx = ((float)this.Size.Width) * (0.05F);
float pady = ((float)this.Size.Height) * (0.05F);

float width = ((float)this.Size.Width) - 2 * padx;
float height = ((float)this.Size.Height) - 2 * pady;

float emSize = height;

g.DrawString(letter, new Font(FontFamily.GenericSansSerif, emSize, FontStyle.Regular),
            new SolidBrush(Color.Black), padx, pady);

نعم أنا أعرف أن هناك تحكم التسمية التي يمكن أن تستخدم بدلا من ذلك تعيين تركز مع ذلك ولكن أنا في الواقع لا تحتاج إلى القيام بذلك يدويا مع Graphics فئة.

هل كانت مفيدة؟

المحلول 3

من خلال مجموعة من الاقتراحات لدي خطرت لي هذه:

    private void DrawLetter()
    {
        Graphics g = this.CreateGraphics();

        float width = ((float)this.ClientRectangle.Width);
        float height = ((float)this.ClientRectangle.Width);

        float emSize = height;

        Font font = new Font(FontFamily.GenericSansSerif, emSize, FontStyle.Regular);

        font = FindBestFitFont(g, letter.ToString(), font, this.ClientRectangle.Size);

        SizeF size = g.MeasureString(letter.ToString(), font);
        g.DrawString(letter, font, new SolidBrush(Color.Black), (width-size.Width)/2, 0);

    }

    private Font FindBestFitFont(Graphics g, String text, Font font, Size proposedSize)
    {
        // Compute actual size, shrink if needed
        while (true)
        {
            SizeF size = g.MeasureString(text, font);

            // It fits, back out
            if (size.Height <= proposedSize.Height &&
                 size.Width <= proposedSize.Width) { return font; }

            // Try a smaller font (90% of old size)
            Font oldFont = font;
            font = new Font(font.Name, (float)(font.Size * .9), font.Style);
            oldFont.Dispose();
        }
    }

حتى الآن, هذا يعمل لا تشوبه شائبة.

الشيء الوحيد الذي أود أن التغيير هو نقل FindBestFitFont() الدعوة إلى OnResize() الحدث بحيث أنا لا أدعو في كل مرة أود أن ألفت رسالة.فإنه يحتاج فقط إلى أن تسمى عند التحكم في حجم التغييرات.أنا فقط في وظيفة للتأكد من اكتمالها.

نصائح أخرى

أود أن أضيف آخر للتصويت StringFormat الكائن.يمكنك استخدام هذا ببساطة تحديد "center" النص سيتم رسمها لتكون في المستطيل أو نقاط المقدمة:

StringFormat format = new StringFormat();
format.LineAlignment = StringAlignment.Center;
format.Alignment = StringAlignment.Center;

ولكن هناك مسألة واحدة مع هذا في را.إذا كنت تستخدم مركز لكل القيم ثم يتحول TextWrapping قبالة.أي فكرة لماذا يحدث هذا ، يبدو أن الخلل مع CF.

لمحاذاة النص الاستخدام التالية:

StringFormat sf = new StringFormat();
sf.LineAlignment = StringAlignment.Center;
sf.Alignment = StringAlignment.Center;
e.Graphics.DrawString("My String", this.Font, Brushes.Black, ClientRectangle, sf);

يرجى ملاحظة أن النص هنا هو الانحياز في حدود معينة.في هذه العينة هذا هو ClientRectangle.

رسم توسيط النص:

TextRenderer.DrawText(g, "my text", Font, Bounds, ForeColor, BackColor, 
  TextFormatFlags.HorizontalCenter | 
  TextFormatFlags.VerticalCenter |
  TextFormatFlags.GlyphOverhangPadding);

تحديد أفضل حجم الخط إلى ملء منطقة هو قليلا أكثر صعوبة.واحد يعمل اتصال الآليات وجدت هو التجربة والخطأ:تبدأ مع الخط الكبير ، ثم مرارا قياس السلسلة و تصغير الخط حتى تناسبها.

Font FindBestFitFont(Graphics g, String text, Font font, 
  Size proposedSize, TextFormatFlags flags)
{ 
  // Compute actual size, shrink if needed
  while (true)
  {
    Size size = TextRenderer.MeasureText(g, text, font, proposedSize, flags);

    // It fits, back out
    if ( size.Height <= proposedSize.Height && 
         size.Width <= proposedSize.Width) { return font; }

    // Try a smaller font (90% of old size)
    Font oldFont = font;
    font = new Font(font.FontFamily, (float)(font.Size * .9)); 
    oldFont.Dispose();
  }
}

كنت استخدم هذا النحو:

Font bestFitFont = FindBestFitFont(g, text, someBigFont, sizeToFitIn, flags);
// Then do your drawing using the bestFitFont
// Don't forget to dispose the font (if/when needed)

يمكنك استخدام مثيل StringFormat وجوه مرت في DrawString طريقة توسيط النص.

انظر الرسومات.الرباط طريقة و StringFormat الدرجة.

هنا بعض التعليمات البرمجية.هذا يفترض أنك تفعل هذا على نموذج أو UserControl.

Graphics g = this.CreateGraphics();
SizeF size = g.MeasureString("string to measure");

int nLeft = Convert.ToInt32((this.ClientRectangle.Width / 2) - (size.Width / 2));
int nTop = Convert.ToInt32((this.ClientRectangle.Height / 2) - (size.Height / 2));

من وظيفة الخاص بك ، فإنه يبدو وكأنه ClientRectangle جزء (كما كنت لا تستخدم ذلك) هو ما يسبب لك صعوبة.

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