在Panel内部绘制PictureBox - C#

时间:2011-11-29 01:31:58

标签: c# graphics bitmap panel picturebox

我在这里的问题是两个人。

我有一个位于面板内部的图片框。当我打开图像时,图片框的大小调整为图像的大小,而面板保持相同的大小。该面板只有滚动条才能看到整个图像。

这有两个问题。

  1. 当我调整图片框的大小时,出于某种原因我只能在图片框的前一部分中绘图。防爆。默认情况下,imagebox默认为200x200。我打开一个500x400的图像。而且我仍然可以在图像的200x200部分绘制。

  2. 我遇到的第二个问题是,当我画画框的选择部分时,当我滚动到我的画面不在视野的地方,然后回来时,我画的图像消失了。我知道我需要某种picturebox.invalidate()。我只是不确定如何使用它。

  3. 这是我的代码,可以很好地掌握我正在做的事情。

    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");
            }
        }
    

    非常感谢!

1 个答案:

答案 0 :(得分:0)

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

你应该(几乎)永远不会依赖CreateGraphics()