0

そのため、自分が何を間違えたのか理解できませんが、画像ボックスを線で埋める必要があります。

public Form1()
        {
            InitializeComponent();
            PictureBox pb = new PictureBox();
        }
        public void Zimet()
        {
            PictureBox pb = new PictureBox();

            Graphics g = pb.CreateGraphics();
            Pen pen1 = new Pen(Color.Red);
            for (int i = 0; i < pb.Height; i++)
            {
                g.DrawLine(pen1, pb.Width, 0, 0, pb.Height);
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Zimet();
        }
4

4 に答える 4

1

まず、あなたPictureBoxはあなたのフィールドである必要がありForm、ボタンをクリックするたびに作成するべきではありません。第二に、DrawLine呼び出しが悪いです。たとえば、水平線が必要な場合は、次のようにする必要があります。

        Pen pen1 = new Pen(Color.Red);
        for (int i = 0; i < pb.Height; i++)
        {
            g.DrawLine(pen1, 0, i, pb.Width, i);
        }

ただし、これは、pictureBox を赤色で塗りつぶすことと同じです。代わりに、i+=2 を更新して 1 行おきにスキップすることをお勧めします。

        Pen pen1 = new Pen(Color.Red);
        for (int i = 0; i < pb.Height; i+=2)
        {
            g.DrawLine(pen1, 0, i, pb.Width, i);
        }

それでも、CreateGraphic() メソッドを使用せずに、すべての描画を Paint イベント ハンドラーで行うことをお勧めします。これは、フォームが無効になるたびに、図面が消去されるためです。たとえば、ボタンをクリックしたときに設定されるブール値を使用し、true の場合は描画を行います。このようなもの:

public class Form1:Form
{
    PictureBox pb;
    bool drawLines = false;
    public Form1()
    {
        InitializeComponent();
        pb = new PictureBox();
        pb.Size = new Size(100,100);
        pb.Location = new Point(0,0);
        pb.Paint+=new PaintEventHandler(pb_Paint);
        this.Controls.Add(pb);
    }
    private void pb_Paint(object sender, PaintEventArgs e)
    {
        if(drawLines)
        {
            Pen pen1 = new Pen(Color.Red);
            for (int i = 0; i < pb.Height; i+=2)
            {
               e.Graphic.DrawLine(pen1, pb.Width, 0, 0, pb.Height);
            }
        }
    }
    public void Zimet()
    {
        drawLines = true; //however this may look redundant, it is still OP's code
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Zimet();
    }
于 2013-10-29T13:57:04.913 に答える
0

関数Zimet()は を作成しPictureboxて描画し、関数の最後でそれを破棄します。

SomeUiObject.Controls.Add(pb);実際にフォームに配置するには、呼び出す必要があります。

于 2013-10-29T13:56:39.573 に答える
0

フォーム コンストラクターでを作成しPictureBox pb、メソッドで別のコンストラクターを作成しますZimet()。メソッド内のZimet()ものはそのメソッドのスコープ内でローカルであるため、メソッドが戻るとスコープ外になります。

PictureBoxコンストラクターで作成された線を描画しようとしていますか? コンストラクターが完了すると、それは範囲外になるためです。おそらく、クラスにフィールドを作成して保持し、メソッドPictureBoxでそれを描画しますZimet()

于 2013-10-29T13:57:47.637 に答える