【问题标题】:pictureBox, graphics and messageBox图片框、图形和消息框
【发布时间】:2013-08-18 01:07:11
【问题描述】:

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

公共部分类 Form1 : Form { 图形 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;
    }
}

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

【问题讨论】:

  • 那么你的问题是什么?
  • 为什么messageBox显示在主窗口后面?
  • 你的主窗口是form1?
  • 您正在编写错误类型的 Winforms 代码。它有点工作,但主要是运气。可能还有其他问题,我们看不到的东西。作为一种可能的创可贴,有一个 MessageBox.Show() 重载,它接受 owner 参数,传递 this。一定要买一本关于 Winforms 的书,这种编码会给你带来很多麻烦。
  • 从上次测试开始,messageBox 直到我按 Alt 键才出现。我在哪里可以关闭此选项?我希望该 messageBox 出现而无需任何额外的按键

标签: c# graphics picturebox messagebox


【解决方案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);
    }
}

【讨论】:

  • 谢谢!一切正常!!!也许你能帮我解决这个问题:stackoverflow.com/questions/17945122/…
  • 第二个例子不好,因为后来我尝试将此图形保存到文件中。所以我需要有 Bitmap 来存储。但我不明白如何将图形 g 转换为位图。任何地方写入位图 b = new bitmap();图形 g = graphics.fromimage(b)。但如果我会使用 g = e.graphics 那么我会得到空白图像
  • 您可以直接从 PictureBox 本身获取并保存图像stackoverflow.com/questions/6845720/…
  • 如果我使用你的 seconf 代码 + pictureBox1.Image.Save("path"),我得到 pictureBox1.Image=> null。在这种情况下,无法使用 e.Graphics 进行绘制。只需将 Bitmap 与 Graphics 一起使用,然后将 Bitmap 分配给 pictureBox.Image,然后再尝试将其保存到文件中。但是对于您的第一个示例,我发现自己可以使用自己的方法进行绘制,而无需 PaintEventArgs,谢谢。我还有一个问题:为什么当我开始使用图形 g 时,与 e.Graphics....(在 PaintEventArgs 中)相比,绘图速度下降了?
猜你喜欢
  • 2017-10-18
  • 2015-01-18
  • 1970-01-01
  • 2012-05-20
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
相关资源
最近更新 更多