Как я могу определить ширину нарисованной строки?

Я рисую строку, используя следующее:

g.DrawString(somestring, somefont, new SolidBrush(Color.Black), X where it starts, Y where it starts));

Проблема:

Иногда я хочу выровнять нарисованную строку по left side line. Но это не сработает, если я не знаю, какой будет длина строки.

Возможное, но нубское решение:

Подсчитайте количество символов, умножьте на значение проб и ошибок и вычтите его в позиции X, например:

string somestring = Convert.ToString(Math.Round(10 * somevalue) / 10) + "m";
int stringcount1 = somestring.Count();
g.DrawString(somestring, somefont, new SolidBrush(Color.Black), X -stringcount1 * trialanderrorvalue, Y));

Это не работает, потому что, как вы можете догадаться, я создаю число, и это число может иметь decimal separator или нет.

И в этом проблема, потому что десятичный разделитель не очень широкий символ, но все же считается, он будет посылать мою строку neptune-far от строки. Или я могу получить приличное значение проб и ошибок для числа с десятичным разделителем, и если в конечном итоге число не будет иметь десятичного разделителя, оно будет над линией (и испортит рисунок).

Любые подсказки? Возможно, заставить строку иметь ,0 в случае, если число является целым числом?

Редактировать:

Теперь я создал метод, который будет возвращать объект aSizeF с заданной строкой и шрифтом.

    static SizeF MeasureStringMin(string measureString, Font stringFont, PaintEventArgs e)
    {
        //// Set up string. 
        //string measureString = "Measure String";
        //Font stringFont = new Font("Arial", 16);

        // Measure string.
        SizeF stringSize = new SizeF();

        stringSize = e.Graphics.MeasureString(measureString, stringFont);

        return stringSize;
    }

Проблема в том, что когда я вспоминаю эту функцию, используя что-то вроде

SizeF stringSize = new SizeF();
stringSize = MeasureStringMin(somestring, somefont, ????)

Никогда не знаю, что поставить в третью переменную, намеки на это? Зачем мне PaintEventArgs?


person ng80092b    schedule 26.04.2015    source источник
comment
Какую именно библиотеку вы используете? WPF, XNA, GDI? Или, точнее, каков тип переменной g?   -  person Mephy    schedule 26.04.2015
comment
Всегда предполагайте, что этот оператор существует, а если нет, добавьте .00?   -  person joachim    schedule 26.04.2015
comment
g будет объектом Graphics — это winforms/GDI.   -  person Blorgbeard    schedule 26.04.2015
comment
@JoachimGotzes, да, это возможность, но сложная также может легко запутаться   -  person ng80092b    schedule 26.04.2015


Ответы (1)


Вам нужна функция MeasureString! Используйте его, чтобы получить точные размеры строки, прежде чем рисовать ее, и соответствующим образом отрегулируйте положение.

person Blorgbeard    schedule 26.04.2015
comment
Я обновил вопрос, и есть простая проблема, которую, я уверен, вы легко решите, можете взглянуть? - person ng80092b; 26.04.2015
comment
Вам нужен PaintEventArgs (e), потому что вы вызываете e.Graphics.MeasureString. Вам нужен экземпляр Graphics для вызова MeasureString. Вы должны делать это в обработчике событий Paint, поэтому у вас должен быть e для передачи. - person Blorgbeard; 26.04.2015
comment
Если у вас нет PaintEventArgs (потому что вы рисуете растровое изображение или что-то в этом роде), то у вас все равно будет экземпляр Graphics, которым вы рисуете, так что просто используйте его вместо e.Graphics. Возможно, вы захотите изменить сигнатуру вашего метода, чтобы он принимал объект Graphics, а не PaintEventArgs. В любом случае, этот метод является простым переходом к MeasureString, поэтому я бы сказал, что он вам действительно не нужен... - person Blorgbeard; 26.04.2015