2014-12-16 3 views
2

Я хочу создать Picturebox, который адаптирует свою форму к строке определенного шрифта. Мне нужно это, чтобы впоследствии создавать тексты и размещать их над элементом управления AxWindowsMediaPlayer.Как получить точный шрифт из Fontfamily?

Поэтому я создал следующий класс:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

using System.Windows.Forms; 
using System.Drawing; 

namespace myProject 
{ 
    class ShapedPictureBoxes : PictureBox 
    { 
     public ShapedPictureBoxes() 
     { 
      this.Paint += this.shapedPaint; 
     } 

    void shapedPaint(object sender, PaintEventArgs e) 
    { 
     System.Drawing.Drawing2D.GraphicsPath graphicsPath = new System.Drawing.Drawing2D.GraphicsPath(); 


Font font = new Font("Arial", 14f); 
float emSize = e.Graphics.DpiY*font.Size/72; 
     graphicsPath.AddString(text, new FontFamily("Arial"), (int)System.Drawing.FontStyle.Regular, emSize, new Point(0,0), new StringFormat()); 

     e.Graphics.DrawString(text, font, Brushes.Red, new Point(0, 0)); 

     this.Region = new Region(graphicsPath); 
    } 

    public string text = "Here comes the sun, doo da doo do"; 
} 

} 

Проблема теперь в том, что «Graphics.DrawString» не соответствует graphicspath.AddString, вероятно, потому, что FontFamily не то же самое, как шрифт. Как я могу их сопоставить?

So: Как я могу преобразовать Fontfamily в Font или наоборот?

Вот как это выглядит:

the result

ответ

1

Вы должны учитывать тот факт, что Font размер задается в единицах точек, но AddString() размер указывается в единицах устройства.

Вы можете преобразовать единицы следующим образом:

Font font = new Font("Arial", 14f, FontStyle.Bold); 
float emSize = e.Graphics.DpiY * font.Size/72; // Here's the conversion. 
graphicsPath.AddString(text, new FontFamily("Arial"), (int)System.Drawing.FontStyle.Bold, emSize, new Point(0, 0), new StringFormat()); 

Обратите внимание, что я передаю вычисленная emSize к AddString() вместо прохождения 14f.

+0

теперь выглядит лучше: я адаптировал вопрос с вашим частичным решением и добавил картинку ... – Salocin

+0

@Salocin Я просто заметил, что ваш 'AddString()' использует Bold, но ваш шрифт не является. Я обновил свой пример, чтобы шрифт использовал Bold. Что происходит сейчас, если вы сделаете то же самое? –

+0

О, это была ошибка, которая была только в вопросе .. скриншот от Fontstyle.Regular ... проблема остается прежней ... похоже, что эти два текста смещаются друг от друга, чем дольше текст .. – Salocin

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