【问题标题】:Drawing on PictureBox inside of Panel - C#在 Panel 内的 PictureBox 上绘图 - C#
【发布时间】:2011-11-29 01:31:58
【问题描述】:

我在这里遇到的问题有点像 2 部分。

我有一个位于面板内部的图片框。当我打开图像时,图片框的大小会调整为图像的大小,而面板的大小保持不变。该面板只有滚动条可以查看整个图像。

这有两个问题。

  1. 当我调整图片框的大小时,由于某种原因,我只能在图片框的前一部分进行绘制。前任。默认情况下,图像框以 200x200 开始。我打开一个 500x400 的图像。而且我仍然只能在图像的 200x200 部分进行绘制。

  2. 我遇到的第二个问题是,当我在图片框的那个选择性部分进行绘制时,当我滚动到我的画不在视线范围内的地方,然后再回来时,我画的图像就消失了。我知道我需要某种picturebox.invalidate()。我只是不知道如何使用它。

这是我的代码,可以很好地掌握我在做什么。

public Form1()
    {
        InitializeComponent();

        DrawArea = new Bitmap(pictureBox1.Size.Width, pictureBox1.Size.Height );
        pictureBox1.Image = DrawArea;

        objGraphics = this.pictureBox1.CreateGraphics();
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
            drawImage(e);
    }

    public void drawImage(MouseEventArgs e)
    {
        Rectangle rDraw = new Rectangle();

        if (e.Button == MouseButtons.Left)
        {
            rDraw.X = e.X;
            rDraw.Y = e.Y;
            rDraw.Width = 3;
            rDraw.Height = 3;
            objGraphics.DrawEllipse(System.Drawing.Pens.Black, rDraw);
        }
    }

    private void openToolStripMenuItem_Click(object sender, EventArgs e)
    {
        try
        {
            OpenFileDialog open = new OpenFileDialog();
            open.Filter = "Image Files(*.jpg; *.bmp)|*.jpg; *.bmp";
            if (open.ShowDialog() == DialogResult.OK)
            {
                Bitmap bit = new Bitmap(open.FileName);

                pictureBox1.Size = bit.Size;
                DrawArea = bit;
                pictureBox1.Image = bit;
            }
        }
        catch (Exception)
        {
            throw new ApplicationException("Failed loading image");
        }
    }

非常感谢!

【问题讨论】:

    标签: c# graphics bitmap panel picturebox


    【解决方案1】:

    你需要在图片框的Paint事件中进行绘制。

    你应该(几乎)永远不要使用CreateGraphics()

    【讨论】:

    • 我该怎么做。我有绘画事件,但我不确定如何使用该事件准确绘制。
    • e.Graphics 上绘图。可以多次触发绘制事件(例如,如果您滚动)。要强制它重新绘制,Invalidate()它。
    • 抱歉这么幼稚。我会超载 on paint 事件吗?从我的 mouse_move 事件中传递它?
    • 没有。处理 PictureBox 的 Paint 事件(除非你想直接在窗体上绘画)并使用它的 e
    • 我让用户在图像上绘图,就好像它在铅笔上一样。我不明白如何与 mouse_over 事件一起执行此操作。
    猜你喜欢
    • 2012-10-21
    • 2012-07-17
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多