6

C# は比較的新しいものです。うまくいけば、単純なものを見落としているだけです。

'drawingArea' と呼ばれる画像ボックスといくつかのボタンを含む 'Exercise1' という名前のフォームがあります。Exercise1 のコンストラクターのコードは次のとおりです。

public Exercise1()
{
    InitializeComponent();
    paper = drawingArea.CreateGraphics();
    balloon = new Balloon("redBalloon", Color.Red, drawingArea.Width / 2, 
        drawingArea.Height / 2, 30);
    paper.Clear(Color.White);
    balloon.Display(paper);   
}
...

'paper' と 'balloon' は、フォームの他のメソッドで使用するために、コンストラクターの上にグローバルとして作成されます。「紙」と「風船」はどちらも、フォームで定義された他のメソッドのコンストラクターで初期化されたとおりに機能します。

何らかの理由で、コマンド

paper.Clear(Color.White);

balloon.Display(paper);

画像ボックスをクリアし、赤い楕円を表示する必要がありますが、実行しないでください (少なくとも目に見えて)。何を与える?

更新: 私はこのウェブサイトが好きになると思います.あなたたちは速いです!
@Nitesh: Exercise1 のコンストラクターが別のフォームから呼び出されます。コードは次のとおりです。

private void button1_Click(object sender, EventArgs e)
        {
            int exSelector = (int)numericUpDown1.Value;
            switch (exSelector)
            {
                case 1:
                    Exercise1 form1 = new Exercise1();
                    form1.Show();
                    break;
...

@Sean Dunford: はい、そうです。
@RBarryYoung: 少し遊んでいましたが、うまくいきませんでした。演習 1 の Form_Load イベントをトリガーするコマンドは?

更新:この変更されたコードは期待どおりに機能します。

public Exercise1()
        {
            InitializeComponent();
            paper = drawingArea.CreateGraphics();
            drawingArea.BackColor = Color.White;
            drawingArea.Paint += new PaintEventHandler(this.drawingArea_Paint);
            balloon = new Balloon("redBalloon", Color.Red, drawingArea.Width / 2, drawingArea.Height / 2, 30); 
        }
        private void drawingArea_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.Clear(Color.White);
            balloon.Display(e.Graphics);
        } 
...

助けてくれてありがとう!

4

3 に答える 3

5

コンストラクタで描画することはできません。適切な描画を行うには、フォームを画面に表示する必要があります。イベントを使用Shownしてレンダリングを行うことができます (ただし、フォームが再描画されると失われる可能性があります)。

通常、最善の方法は、コンストラクターで必要なフラグを設定しPaint、フォームのイベントを使用してすべての描画を行うことです。後で何かを再描画する必要がある場合は、レンダリングする必要がある状態を設定し、フォームを無効にして (これによりPaintイベントが発生します)、新しい状態を再描画できます。

カスタマイズされた描画を (Paintイベント外で) 実行しようとすると、フォームがランダムに空白になったり、フォームのサイズを変更/最小化したときに描画が消えたりするリスクがあります。

于 2012-10-09T20:10:39.567 に答える
1

コンストラクターでグラフィックスを使用します。つまり、紙に1回だけ描​​画します。コンストラクターの後に何らかの理由で再描画すると、drawingAreaが元の方法で描画されます。PaintEventHandlerをdrawingAreaに追加してから、balloon.Display(e.Graphics);内で呼び出してみてください。

    public Exercise1()
    {
        InitializeComponent();

        balloon = new Balloon("redBalloon", Color.Red, drawingArea.Width / 2, 
        drawingArea.Height / 2, 30);


        drawingArea.Paint += new PaintEventHandler(drawingArea_Paint);
    }

    void drawingArea_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.Clear(Color.White);
        baloon.Display(e.Graphics);
    }
于 2012-10-09T20:10:11.387 に答える
0

OnPaintフォームイベント ハンドラをオーバーライドする必要があります。そうすることで、紙とバルーンの領域を再描画するグラフィック コンテキストを取得できます。

于 2012-10-09T20:12:42.577 に答える