Menggambar di PictureBox di dalam Panel - C#

Pertanyaan yang saya miliki di sini adalah semacam 2 bagian.

Saya memiliki kotak gambar yang diposisikan di dalam panel. Saat saya membuka gambar, kotak gambar diubah ukurannya sesuai ukuran gambar, sedangkan ukuran panel tetap sama. Panel hanya memiliki bilah gulir untuk melihat keseluruhan gambar.

Ada 2 hal yang salah dengan ini.

  1. Ketika saya mengubah ukuran kotak gambar, entah mengapa saya hanya dapat menggambar di bagian kotak gambar sebelumnya. Mantan. Imagebox dimulai secara default dengan ukuran 200x200. Saya membuka gambar berukuran 500x400. Dan saya hanya masih bisa menggambar pada bagian gambar 200x200.

  2. Masalah kedua yang saya alami adalah ketika saya menggambar di bagian selektif kotak gambar, ketika saya menggulir ke tempat lukisan saya tidak terlihat, dan kembali, gambar yang saya lukis hilang. Saya tahu ada semacam picturebox.invalidate() yang saya butuhkan. Saya hanya tidak yakin bagaimana cara menggunakannya.

Ini kode saya untuk memahami dengan baik apa yang saya lakukan.

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

Terima kasih banyak!


person Johnrad    schedule 29.11.2011    source sumber


Jawaban (1)


Anda perlu menggambar di acara Paint kotak gambar.

Anda seharusnya (hampir) tidak pernah menggambar di CreateGraphics().

person SLaks    schedule 29.11.2011
comment
Bagaimana tepatnya saya melakukan itu. Saya memiliki acara melukis tetapi saya tidak yakin cara menggambar menggunakan acara tersebut. - person Johnrad; 29.11.2011
comment
Gambarlah e.Graphics. Peristiwa cat dapat dipicu berkali-kali (misal, jika Anda menggulir). Untuk memaksanya mengecat ulang, Invalidate() itu. - person SLaks; 29.11.2011
comment
Maaf karena terlalu naif. Saya akan membebani acara on paint secara berlebihan, benar? meneruskannya dari acara mouse_move saya? - person Johnrad; 29.11.2011
comment
Tidak. Tangani acara Paint PictureBox (kecuali jika Anda ingin melukis langsung pada formulir) dan gunakan e-nya. - person SLaks; 29.11.2011
comment
Saya membiarkan pengguna menggambar pada gambar seolah-olah itu adalah pensil. Saya tidak mengerti bagaimana saya bisa melakukan ini bersamaan dengan acara mouse_over. - person Johnrad; 29.11.2011
comment
Simpan garis yang digambar pengguna di event mouse, dan gambar semua garis tersebut di event paint. - person SLaks; 29.11.2011