1

我对这些元素有一些问题。我尝试用图形画线并将其放在图片框上。然后我调用 MessageBox,它在我的主窗口后面运行。当然,我不能使用 mainWindow,因为程序等待单击 MessageBox 的按钮。但我没有看到。按钮 Alt 仅对我有帮助,或者 Alt+Tab,但它很愚蠢。所以,这是我的代码:

公共部分类Form1:表格{图形g; 位图 btm;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        btm = new Bitmap(pictureBox1.Size.Width, pictureBox1.Size.Height);
        g = CreateGraphics();
        g = Graphics.FromImage(btm);
        Pen p = new Pen(Brushes.Red);
        g.DrawLine(p, 0, 0, btm.Size.Width, btm.Size.Height);            
        pictureBox1.Refresh();
        g.Dispose();
    }

    protected override void OnClosing(CancelEventArgs e)
    {
        DialogResult dr = MessageBox.Show("Exit?", "Exit", MessageBoxButtons.YesNo);
        if (dr == DialogResult.No) e.Cancel = true; else e.Cancel = false;
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        pictureBox1.Image = btm;
    }
}

告诉我,我的问题在哪里?谢谢

4

1 回答 1

1

当窗体刷新时,将调用绘制事件。此时您可以通过设置标志来避免自定义绘图。

bool updatePictureBox = true;

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    if(updatePictureBox)
        pictureBox1.Image = btm;
}

protected override void OnClosing(CancelEventArgs e)
{
    updatePictureBox = false;
    DialogResult dr = MessageBox.Show(this,"Exit?", "Exit", MessageBoxButtons.YesNo);
    if (dr == DialogResult.No) e.Cancel = true; else e.Cancel = false;
}

Paint但是,您可以通过在事件本身内绘制来避免整个问题。我建议这样做而不是使用上面的标志方法。

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    var g = e.Graphics;            
    using (Pen p = new Pen(Brushes.Red))
    {
        g.DrawLine(p, 0, 0, pictureBox1.Width, pictureBox1.Height);
    }
}
于 2013-08-15T19:06:22.263 回答