Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2010, 18:35   #1
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию Скриншот выделеной области экрана. Как стерать прошлый прямоугольник

Событие движения мыши по форме растянутой на весь экран BorderStyle == None. У меня на форме скриншот экрана изображён и кажется как будто ты с экрана выделяешь область. Но вот проблема в том, что у меня остаётся много прямоугольников внутри моего прямоугольника, то есть ещё и портит картинку. На Codeproject смотрел пример, скачал, но там экран при выделении каким-то жёлтым становиться, короче мне это не подходит. Да и хочу сам по своему сделать. А то копи пастом многому не научишься.

Код:
        ......
        Pen pen = new Pen(Color.Chocolate);
        Pen ErasePen = new Pen(Color.FromArgb(100, 100, 100)); //вот тут абсолютно на угад выставлено
        ......


        /// <summary>
        /// Движение мыши по форме
        /// </summary>
        /// <param name="sender">Отправитель</param>
        /// <param name="e">Аргументы</param>
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                gr.DrawRectangle(ErasePen, rect);

                nowPoint.X = e.X;
                nowPoint.Y = e.Y;
                if (nowPoint.X > clickPoint.X)
                {
                    size.Width = nowPoint.X - clickPoint.X; //вычитаем из места где был первый клик, текущее 
                    rect.X = clickPoint.X;
                }
                else
                {
                    size.Width = clickPoint.X - nowPoint.X;
                    rect.X = clickPoint.X - size.Width;                    
                }

                if (nowPoint.Y > clickPoint.Y)
                {
                    size.Height = nowPoint.Y - clickPoint.Y;
                    rect.Y = clickPoint.Y;
                }
                else
                {
                    size.Height = clickPoint.Y - nowPoint.Y;
                    rect.Y = clickPoint.Y - size.Height;
                }

                
                rect.Width = size.Width;
                rect.Height = size.Height;

                    gr.DrawRectangle(pen, rect);
            }
        }

Последний раз редактировалось Casper-SC; 24.03.2010 в 23:17. Причина: Прошлый способ был не правильным
Casper-SC вне форума Ответить с цитированием
Старый 25.03.2010, 00:12   #2
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Всё, я понял. Я вообще не правильно делал. Щас делаю так: "фоткаю" экран, растягиваю форму на весь экран, предварительно сделав её TopMost = true; Далее растягиваю вторую форму прозрачную закрашенную в жёлтый. и делаю её активной и она поверх той первой формы становиться. Выделяю одим цветом и стераю другим, тем которым зарашена форма изначально и получается всё как надо. Дальше пока не доделал.

===============================

Вот попробовал сделать, что-то получилось, но выделяемая область постоянно мигает при выделениии. Получилось почти как в "Ножницы" в Windows 7, но мигает, помогите кто нибудь это исправить. А ну и пока не сохраняет скриншот Может кто знает как это исправить? Вообще впервые с графическими элементами работаю. Screenshot_Losso.rar ~25 килобайт (качается без рекламы с народа).
Кто знает как можно сначало сформировать изображение и потом его вывести на экран, подозреваю так надо.
Код:
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                //gr.DrawRectangle(pen, rectSelected); //рисуем прямоугольник которым выделяем область

                nowPoint.X = e.X;
                nowPoint.Y = e.Y;
                if (nowPoint.X > clickPoint.X)
                {
                    size.Width = nowPoint.X - clickPoint.X; //вычитаем из места где был первый клик текущее 
                    rectSelected.X = clickPoint.X;
                }
                else
                {
                    size.Width = clickPoint.X - nowPoint.X;
                    rectSelected.X = clickPoint.X - size.Width;                    
                }

                if (nowPoint.Y > clickPoint.Y)
                {
                    size.Height = nowPoint.Y - clickPoint.Y;
                    rectSelected.Y = clickPoint.Y;
                }
                else
                {
                    size.Height = clickPoint.Y - nowPoint.Y;
                    rectSelected.Y = clickPoint.Y - size.Height;
                }

                
                rectSelected.Width = size.Width;
                rectSelected.Height = size.Height;

                
                    gr.FillRectangle(brushBack, rectBack); //заливаем всю форму жёлтым цветом, чтобы стереть косяки
                    gr.FillRectangle(br, rectSelected);
                    gr.DrawRectangle(pen, rectSelected); //рисуем прямоугольник которым выделяем область
                    gr.FillRectangle(br, rectSelected);
                    gr.DrawRectangle(pen, rectSelected); //рисуем прямоугольник которым выделяем область
                    
            }
        }

Последний раз редактировалось Casper-SC; 25.03.2010 в 10:57.
Casper-SC вне форума Ответить с цитированием
Старый 27.03.2010, 11:49   #3
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Вот сам решил проблему:
Код:
        /// <summary>
        /// Отрисовываем всё в буфере
        /// </summary>
        public void DrawTOBuffer()
        {   //выставляем размер буфера "весь экран"
            bufferGraphicsContext.MaximumBuffer = new Size(this.Width + 1, this.Height + 1);
            
            bufferGraphics = bufferGraphicsContext.Allocate(gr,
                 new Rectangle(0, 0, this.Width + 1, this.Height + 1)); //создаём буфер

            bufferGraphics.Graphics.FillRectangle(brushBack, rectBack); //стераем прошлый рисунок
            bufferGraphics.Graphics.DrawRectangle(pen, rectSelected); //рисуем новый прямоугольник
            bufferGraphics.Graphics.FillRectangle(br, rectSelected); //заливаем его цветом
        }

Вызываем метод в событии MouseMove (в моём случае)
Код:
        /// <summary>
        /// Движение мыши по форме
        /// </summary>
        /// <param name="sender">Отправитель</param>
        /// <param name="e">Аргументы</param>
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                nowPoint.X = e.X;
                nowPoint.Y = e.Y;
                if (nowPoint.X > clickPoint.X)
                {
                    size.Width = nowPoint.X - clickPoint.X; //вычитаем из места где был первый клик текущее 
                    rectSelected.X = clickPoint.X;
                }
                else
                {
                    size.Width = clickPoint.X - nowPoint.X;
                    rectSelected.X = clickPoint.X - size.Width;                    
                }

                if (nowPoint.Y > clickPoint.Y)
                {
                    size.Height = nowPoint.Y - clickPoint.Y;
                    rectSelected.Y = clickPoint.Y;
                }
                else
                {
                    size.Height = clickPoint.Y - nowPoint.Y;
                    rectSelected.Y = clickPoint.Y - size.Height;
                }
                
                rectSelected.Width = size.Width;
                rectSelected.Height = size.Height;
               
                DrawTOBuffer(); //Производим отрисовку в буфере
                bufferGraphics.Render(); //выводим, то что отрисовалось в буфере
            }
        }

Ну и это можно запихать в конструктор, я в событие нажатия кнопки, которая запускала вообще весь процесс создания места на котором выделяешь область иначе была ошибка, особо пока не вникал, сделал работает, пока и этому рад:

Код:
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            gr = Graphics.FromHwnd(this.Handle);
            bufferGraphicsContext = new BufferedGraphicsContext();
            bufferGraphicsContext = BufferedGraphicsManager.Current;
Casper-SC вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неудаётся сделать скриншот экрана и отлавить клавиши Вавел из ГМТУ Общие вопросы Delphi 4 13.09.2009 14:53
Клик в нужной части экрана suvor111 JavaScript, Ajax 9 29.04.2009 19:57
Копирование части экрана консоли в C# Skrutik Общие вопросы .NET 3 03.03.2009 19:13
Скриншот экрана ViNcHeStEr Паскаль, Turbo Pascal, PascalABC.NET 5 08.07.2008 12:35
Скриншот экрана Terran Общие вопросы Delphi 2 16.12.2007 15:13