Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Мерцание при отрисовке изображения


Автор: Dmitrii 30.8.2010, 02:07
Необходимо реализовать выделение части изображения(как во всех графических редакторах) и "лупу" в отдельном PictureBox'е.
При отрисовке PictureBox область выделения мерцает+область выделения можно вывести за пределы PictureBox(можно выделять весь экран), как от этого можно избавиться? Также мерцает изображение в PictureBox "лупы".
Выложу код методо MouseMove, MouseUp и MouseDown(все основное действо происходит в них).
Код

private void source_MouseMove(object sender, MouseEventArgs e)
        {            
       /*     filtered_g.Clear(Color.White);
            filtered_g.DrawImage(source.Image, new Rectangle(0, 0, 180, 180), new Rectangle((int)(((e.X - add_width) * work_coeff) - (180/2) / scale_factor), (int)(((e.Y - add_height) * work_coeff) - (180/2) / scale_factor), (int)(180 / scale_factor),(int)( 180 / scale_factor)), GraphicsUnit.Pixel);
            filtered_g.DrawLine(new Pen(Brushes.Black, 2), 90, 80, 90, 100);
            filtered_g.DrawLine(new Pen(Brushes.Black, 2), 80, 90, 100, 90);*/ - попытка сделать ручной magnifier
            if (selection) {
                if (delete_selection == false)
                {
                    ControlPaint.DrawReversibleFrame(Select, this.BackColor, FrameStyle.Dashed);                    
                }
                Point endPoint = ((Control)sender).PointToScreen(new Point(e.X, e.Y));
                int width = endPoint.X - Start.X;
                int height = endPoint.Y - Start.Y;
                Select = new Rectangle(Start.X, Start.Y, width, height);
                ControlPaint.DrawReversibleFrame(Select, this.BackColor, FrameStyle.Dashed);
                delete_selection = false;            
            }
        }

        private void source_MouseDown(object sender, MouseEventArgs e)
        {                             
                selection = true;
                Control control = sender as Control;
                Start = control.PointToScreen(new Point(e.X, e.Y));                            
        }

        private void source_MouseUp(object sender, MouseEventArgs e)
        {
            if (selection == true)
                selection = false;                            
        }

this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); - Не помогает.
Прикреплю полное решение, если кому - то захочется помочь.

Автор: userdab 3.9.2010, 18:14
Посмотрите здесь http://social.msdn.microsoft.com/Forums/ru-RU/windowsru/thread/3d05b2c7-ff10-4113-a00e-2c041fc5db23 , должно помочь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)