2017-10-13 1 views
1

私の質問を言葉よりも例を用いて説明する方が簡単です。 「私は二TextRendererラインは、単に右矢印を描くのではなく、フォームにこのコントロールを追加し、一覧の[Wingdings 12
にそのフォントのプロパティを設定しなぜTextRendererがUserControlにWingdingsフォントを描画していないのですか?

namespace WindowsFormsApplication1 { 

    public partial class UserControl1 : UserControl { 

     public UserControl1() { 
      InitializeComponent(); 
     } 

     private void UserControl1_Paint(object sender, PaintEventArgs e) { 
      Graphics g = CreateGraphics(); 
      TextRenderer.DrawText(g, "à", new Font("Wingdings", 12), new Point(10, 10), Color.Black); 
      TextRenderer.DrawText(g, "à", Font, new Point(30, 10), Color.Black); 
      TextRenderer.DrawText(g, "à", new Font(Font.Name, Font.Size), new Point(50, 10), Color.Black); 
      g.Dispose(); 
     } 
    } 
} 

は、これは私のUserControl1のコードですà "と表示されます。
3行目は、最初の行と同じように矢印を描きます。

多分私はいくつかの設定が不足している、誰かがそれを説明することができますか?

+2

私はフォントマッパーがステップインするのは説得力のある理由はありませんが、ePrintを使用せず、フォントを破棄しないで、OnPaintをオーバーライドしないための-100エレガンスポイントです。 –

+0

新しい回答として回答します。 –

答えて

2

最初のDrawText()関数呼び出しでWingdings Fontオブジェクトを作成しましたが、2番目と3番目のDrawText()関数呼び出しで使用するオブジェクトを保存しないため、デフォルトのフォントに戻ります。具体的には、this.Fontオブジェクトを使用しています。これは、UserControl用に設定されたフォントです。

これを修正するには、Wingdings Fontオブジェクトを変数に保存してから、DrawText()を呼び出すたびに再利用する必要があります。

また、Paintイベントハンドラの内部でCreateGraphics()関数を呼び出さないでください。 Paintイベントハンドラは、PaintEventArgsのメンバーとして引き渡されるGraphicsオブジェクトを既に取得しています。それは、あなたがそれを処分することを気にする必要がないので、より効率的で、より簡単になります。

あなたは(Fontオブジェクトのように)何かを配置する必要性を行う

は、using文でそれをラップすることをお勧めします。これにより、ご自分でDispose()を呼び出すことや、例外が発生しても心配することなく、が自動的にになります。

ので、考慮にこれらの点を取って、あなたがあなたのコードを書き換える必要があります。

private void UserControl1_Paint(object sender, PaintEventArgs e) { 
    using (Font f = new Font("Wingdings", 12)) { 
     TextRenderer.DrawText(e.Graphics, "à", f, new Point(10, 10), Color.Black); 
     TextRenderer.DrawText(e.Graphics, "à", f, new Point(30, 10), Color.Black); 
     TextRenderer.DrawText(e.Graphics, "à", f, new Point(50, 10), Color.Black); 
    } 
} 

あなたは常には、ユーザーコントロールがWingdingsフォントを使用してテキストを描画したい場合あるいは、あなただけのように、そのフォントを設定することができますコントロールのフォント:

public partial class UserControl1 : UserControl { 

    public UserControl1() { 
     InitializeComponent(); 
     this.Font = new Font("Wingdings", 12); 
    } 

    private void UserControl1_Paint(object sender, PaintEventArgs e) { 
     TextRenderer.DrawText(e.Graphics, "à", this.Font, new Point(10, 10), Color.Black); 
     TextRenderer.DrawText(e.Graphics, "à", this.Font, new Point(30, 10), Color.Black); 
     TextRenderer.DrawText(e.Graphics, "à", this.Font, new Point(50, 10), Color.Black); 
    } 
} 

私はそれが新しいFontオブジェクトにコントロールが描画されますたびに作成する必要はありませんので、これは、もう少し効率的になると思います。

+0

コードの効率性についてお考えいただきありがとうございます。ただし、DrawText()への最初の呼び出しは、比較のためだけに配置されていました。フォームデザイナーのUserControlフォントプロパティをWingdings 12に設定しました。これは 'this.Font'にする必要があります。そして実際には、3番目の呼び出しで 'new Font(Font.Name、Font.Size)'が正しく描画されたWingdings 12になるためです。 –

-1

私は「エレガント」フォーマットに私のコードを変更しました:

namespace WindowsFormsApplication1 { 
public partial class UserControl1 : UserControl { 

    public UserControl1() { 
     InitializeComponent(); 
    } 

    protected override void OnPaint(PaintEventArgs e) { 
     base.OnPaint(e); 
     using (Font f1 = new Font("Wingdings", 12)) 
     using (Font f2 = new Font(Font.Name, Font.Size)) { 
      TextRenderer.DrawText(e.Graphics, "à", f1, new Point(10, 10), Color.Black); 
      TextRenderer.DrawText(e.Graphics, "à", Font, new Point(30, 10), Color.Black); 
      TextRenderer.DrawText(e.Graphics, "à", f2, new Point(50, 10), Color.Black); 
     } 
    } 
} 
} 

これは、結果では絶対に変更を行いません!
1番目と3番目の呼び出しでは、DrawText()は矢印を描画し、2番目の呼び出しでは "à"を描画します。

関連する問題