2

カスタム コントロールで右揃えのテキストを描画しようとしていますが、何らかの理由でターゲットの水平位置に揃えられず、文字列間に違いがあるようです。

ターゲットの水平位置と正確に一致しないという事実は我慢できますが、文字列の違いは視覚的にひどいものです!

ポインタはありますか?

ここに画像の説明を入力

分離されたコード:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace RightAlignTest {
    class RightControlTest : UserControl {
        public RightControlTest() {
            this.SetStyle(ControlStyles.UserPaint, true);
            this.SetStyle(ControlStyles.ResizeRedraw, true);
        }

        public static void DrawString(Graphics g, string s, Font f, RectangleF r, Color c) {
            float locx = r.Left;
            float locy = r.Top;
            SizeF txts = g.MeasureString(s, f);
            locx = (locx + r.Width - txts.Width);
            g.DrawString(s, f, new SolidBrush(c), locx, locy);
        }

        protected override void OnPaint(PaintEventArgs e) {
            base.OnPaint(e);
            int rightTarget = Width - 20;
            Font f = new Font("Arial Unicode MS", 13f, FontStyle.Regular);
            int i = 0;
            string[] strings = { "Current Limit 1:", "Current Limit 2:", "Temperature Center 1:", "Temperature Center 2:" };
            foreach (var s in strings) {
                Rectangle r1 = new Rectangle(0, 30 * i++, rightTarget, Height);
                DrawString(e.Graphics, s, f, r1, Color.Black);
            }
            e.Graphics.DrawLine(new Pen(new SolidBrush(Color.Blue)), rightTarget, 0, rightTarget, Height);
        }
    }
    public partial class Form1 : Form {
        public Form1() {
            RightControlTest t = new RightControlTest();
            t.Dock = DockStyle.Fill;
            Controls.Add(t);
        }
    }
}
4

2 に答える 2

3

これが機能するかどうか試してください:

public static void DrawString(
    Graphics g, string s, Font f, 
    RectangleF r, Color c) 
{
    StringFormat stringFormat = new StringFormat();
    stringFormat.Alignment = StringAlignment.Far;
    stringFormat.LineAlignment = StringAlignment.Center; // Not necessary here
    g.DrawString(s, f, new SolidBrush(c), r, stringFormat);
}

http://msdn.microsoft.com/en-us/library/332kzs7c.aspxStringFormatからの例を使用

于 2012-07-12T11:48:20.677 に答える