Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/34: Рейтинг темы: голосов - 34, средняя оценка - 4.53
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705

Выделение области на экране

23.01.2015, 13:00. Показов 7378. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно сделать выдиление области на экране, но что бы при этом экран был затемнен, и в зоне, которую будет выделять мышкой(LMBCDown+MouseMove) должна показыватся оригинальная часть экрана. Есть возможно уже готовые решения, или такое сделать нельзя?

З.Ы. Хочу сделать программу которая будет делать скриншот выдиленной области на экране.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.01.2015, 13:00
Ответы с готовыми решениями:

Выделение области на изображении
Здравствуйте! У меня в приложении есть PictureBox. Мне нужно организовать выделение фрагмента изображения в нем мышью. Идей много, но как...

Выделение области для скриншота
Хочу сделать программку для снятия области скриншота, которая заливала бы файлы на imgur. Сам процесс выделения хочу сделать как в...

Программное выделение области на PictureBox
Всем привет, есть небольшая проблема, возможно ли сделать чтобы на одном picturebox выделялась всегда одна и та же область(программно, не...

7
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
23.01.2015, 14:40
Делаем снимок экрана через Graphics.CopyFromScreen, затем снимок кладем на свою форму. Форму растягиваем на весь экран и уже на своей форме делаем затемнения, выделения и т.п.
0
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
23.01.2015, 23:20  [ТС]
Storm23, Окей а вот как это сделать что бы получилось так как я описал?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
24.01.2015, 00:00
Лучший ответ Сообщение было отмечено Ev_Hyper как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
using System.Drawing;
using System.Windows.Forms;
 
namespace WindowsFormsApplication234
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
 
            new Button {Text = "Close me", Parent = this}.Click += (o, e) => Application.Exit();
            this.FormBorderStyle = FormBorderStyle.None;
            TopMost = true;
            ShowInTaskbar = false;
            WindowState = FormWindowState.Maximized;
            BackgroundImage = Shoot();
        }
 
        private Bitmap Shoot()
        {
            var bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
            using (var gr = Graphics.FromImage(bmp))
                gr.CopyFromScreen(0, 0, 0, 0, new Size(bmp.Width, bmp.Height));
            return bmp;
        }
 
        private Rectangle SelectedRectangle;
 
        protected override void OnMouseDown(MouseEventArgs e)
        {
            SelectedRectangle.Location = e.Location;
        }
 
        protected override void OnMouseUp(MouseEventArgs e)
        {
            if (SelectedRectangle.Width > 0 && SelectedRectangle.Height > 0)
            {
                SaveSelectedRectangle();
                SelectedRectangle.Size = Size.Empty;
                Invalidate();
            }
        }
 
        protected override void OnMouseMove(MouseEventArgs e)
        {
            var newSize = new Size(e.X - SelectedRectangle.Left, e.Y - SelectedRectangle.Top);
 
            if (MouseButtons == MouseButtons.Left)
            if (newSize.Width > 5 && newSize.Height > 5)
            {
                SelectedRectangle.Size = newSize;
                Invalidate();
            }
        }
 
        private void SaveSelectedRectangle()
        {
            var sfd = new SaveFileDialog() {Filter = "Images|*.png;*.bmp;*.jpg", DefaultExt = ".png"};
 
            if(sfd.ShowDialog() == DialogResult.OK)
            using(var bmp = new Bitmap(SelectedRectangle.Width, SelectedRectangle.Height))
            using(var gr = Graphics.FromImage(bmp))
            {
                gr.DrawImage(BackgroundImage, -SelectedRectangle.Left, -SelectedRectangle.Top);
                bmp.Save(sfd.FileName);
            }
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            var r = new Region(ClientRectangle);
            r.Exclude(SelectedRectangle);
            using (var brush = new SolidBrush(Color.FromArgb(20, 0, 0, 0)))
                e.Graphics.FillRegion(brush, r);
        }
    }
}
1
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
28.01.2015, 13:52  [ТС]
Storm23, Все хорошо если юзать
C#
1
Screen.PrimaryScreen и WindowState = FormWindowState.Maximized;
Но если на пример у меня два или три монитора, и я ставлю:
C#
1
2
WindowState = FormWindowState.Normal;
this.Bounds = new Rectangle(0, 0, Screen.AllScreens[Screen.AllScreens.Length - 1].Bounds.Right, Screen.AllScreens[Screen.AllScreens.Length - 1].Bounds.Bottom);
То когда веду мышкой лагает так что просто ппц, вот как это устранить?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
28.01.2015, 14:15
siriusED, Тормозит из-за затенения. При каждом движениии мыши нужно перерисовывать затенение, и если площадь прорисовки - большая, оно тормозит. Тут два варианта - либо отказаться от затенения (и рисовать просто рамку) либо нужно немноо подумать и оптимизировать прорисовку. Я бы выбрал первое.
0
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
28.01.2015, 16:06  [ТС]
Storm23, Ну пока что реализовал только под один монитор, да и в принципе для 1,0 хватит, но все таки интересно вот стандартные виндосовские "Ножницы" же как то затемняют на всю площину двух мониторов, и при этом лагов ноль, вот мне надо прямо один в один как у ножниц)
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
28.01.2015, 19:34
Ну я подумаю чуть позже, если придумаю хорошее решение - отпишусь.

Добавлено через 2 часа 53 минуты
Вот вроде побыстрее работает (хотя у меня оно и так не очень тормозило).

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
using System.Drawing;
using System.Windows.Forms;
 
namespace WindowsFormsApplication232
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
 
            new Button { Text = "Close me", Parent = this }.Click += (o, e) => Application.Exit();
            this.FormBorderStyle = FormBorderStyle.None;
            TopMost = true;
            ShowInTaskbar = false;
 
            //WindowState = FormWindowState.Maximized;
            WindowState = FormWindowState.Normal;
            this.Bounds = new Rectangle(0, 0, Screen.AllScreens[Screen.AllScreens.Length - 1].Bounds.Right, Screen.AllScreens[Screen.AllScreens.Length - 1].Bounds.Bottom);
 
            BackgroundImage = Shoot();
        }
 
        private Bitmap Shoot()
        {
            var bmp = new Bitmap(ClientSize.Width, ClientSize.Height);
            using (var gr = Graphics.FromImage(bmp))
                gr.CopyFromScreen(0, 0, 0, 0, new Size(bmp.Width, bmp.Height));
            return bmp;
        }
 
        private Rectangle SelectedRectangle;
 
        protected override void OnMouseDown(MouseEventArgs e)
        {
            SelectedRectangle.Location = e.Location;
        }
 
        protected override void OnMouseUp(MouseEventArgs e)
        {
            if (SelectedRectangle.Width > 0 && SelectedRectangle.Height > 0)
            {
                SaveSelectedRectangle();
                SelectedRectangle.Size = Size.Empty;
                Invalidate();
            }
        }
 
        protected override void OnMouseMove(MouseEventArgs e)
        {
            var newSize = new Size(e.X - SelectedRectangle.Left, e.Y - SelectedRectangle.Top);
 
            if (MouseButtons == MouseButtons.Left)
                if (newSize.Width > 5 && newSize.Height > 5)
                {
                    SelectedRectangle.Size = newSize;
                    Invalidate();
                }
        }
 
        private void SaveSelectedRectangle()
        {
            var sfd = new SaveFileDialog() { Filter = "Images|*.png;*.bmp;*.jpg", DefaultExt = ".png" };
 
            if (sfd.ShowDialog() == DialogResult.OK)
                using (var bmp = new Bitmap(SelectedRectangle.Width, SelectedRectangle.Height))
                using (var gr = Graphics.FromImage(bmp))
                {
                    gr.DrawImage(BackgroundImage, -SelectedRectangle.Left, -SelectedRectangle.Top);
                    bmp.Save(sfd.FileName);
                }
        }
 
        protected override void OnPaintBackground(PaintEventArgs e)
        {
            //base.OnPaintBackground(e);
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            e.Graphics.DrawImageUnscaled(BackgroundImage, 0, 0);
 
            e.Graphics.DrawRectangle(Pens.Red, SelectedRectangle);
            
            var r = new Region(ClientRectangle);
            r.Exclude(SelectedRectangle);
            using (var brush = new SolidBrush(Color.FromArgb(30, 0, 0, 0)))
                e.Graphics.FillRegion(brush, r);
        }
 
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.01.2015, 19:34
Помогаю со студенческими работами здесь

Выделение области изображения в picturebox
Есть изображение, внутри которого нужно выделить область с которой дальше придется работать(передвигать по экранной форме). Худо бедно, с...

Выделение определённой области экрана
Если в кратце, то мне надо чтобы по нажатию на кнопку надо было сделать 2 клика и выделить область экрана, отрисовать там полупрозрачный...

Выделение произвольной области изображения
Пишу прогу для обработки изображения,ламер в С#. Подскажите как выделить произвольную область изображения(форматы jpg,gif,png). .Создал...

Выделение прямоугольной области в PictureBox мышкой
Делаю простенький редактор изображений для себя. Нужно сделать что то типа выделения отдельного прямоугольника изображения для дальнейших...

Выделение области в PictureBox и сохранение ее в Bitmap
Вот к примеру pictureBox, как сделать так что бы на нем можно было выделить область и эта область(картинка) сохранилась в Bitmap?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru