Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/83: Рейтинг темы: голосов - 83, средняя оценка - 4.77
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451

Как сделать рамку выделения на PictureBox?

26.12.2009, 12:59. Показов 17589. Ответов 61
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я не знаю как это правильно называется, но мне нужно сделать выделение типа как в PhotoShop или Paint, чтобы при нажатой левой кнопке мыши можно было бы протащить ее по PictureBox и рисовался бы соответствующий прямоугольник, выделяя тем самым фрагмент рисунка. Как это можно сделать? Хоть в какую сторону смотреть? Подскажите!
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.12.2009, 12:59
Ответы с готовыми решениями:

Как сделать рамку PictureBox-а с возможностью изменения размера?
Как возможно сделать рамки примерно как тут? Хоть одну как сделать подскажите? Облазил весь гугел.

Как нарисовать рамку в Picturebox
Добрый день! Мне нужно нарисовать на Picturebox рамку: то есть, прямоугольник(0,0,picturebox.width, picturebox.height) так, чтобы...

Как поверх PictureBox нарисовать рамку и получить координаты ее углов?
Как можно поверх картинки, загруженной в PictureBox нарисовать прямоугольную рамку с заданным шириной и высотой (т.е. ее размер не нужно...

61
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
26.12.2009, 13:36  [ТС]
Вот что я имею в виду
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
27.12.2009, 07:26
В GDI+. Рисуете пунктирные линии или прямоугольник. Ловите координаты нажатия мыши, а при событии движения получаете координаты противоположного угла выделения.
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
27.12.2009, 13:09  [ТС]
Не, ну это в принципе понятно. А как сделать чтобы битмап, на котором я буду рисовать этот прямоугольник, был прозрачным? Или каждый раз в mouseMove заново мой исходный битмап загружать, чтобы каждый раз рисовать прямоугольник другого размера?
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
27.12.2009, 17:28
А если попробовать создать над битмапом другой прозрачный элемент управления (напимер, Lable) и на нем рисовать? По событию движения мыши очищать и перерисовывать? Как-то так раньше делал.
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
27.12.2009, 18:19  [ТС]
А, ну так можно же наверное другой pictureBox наложить и сделать его прозрачным. Как-то не подумала сразу.
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
27.12.2009, 19:21
Можно и его. В принципе, выбор элемента не особо важен
Успеха!
1
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
27.12.2009, 19:27  [ТС]
Спасибо! Попробую!
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
27.12.2009, 22:12
Если не сложно, 'спасибо' под сообщением...
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
27.12.2009, 23:12  [ТС]
Конечно несложно. Все время забываю об этой кнопке.

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

Добавлено через 18 минут
Не, все тоже самое.

Может тогда действительно каждый раз в mouseMove на самой картинке рисовать прямоугольник и всю картинку перерисовывать?

Хм... Тогда такие тормоза появляются!
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
28.12.2009, 03:30
С тормозами я тоже сталкивался. Может переопределить событие перерисовки 'верхнего' объекта?

Добавлено через 3 минуты
И совсем страшная идея:
Над изображением создать еще одну форму, но без бордюр и с прозрачностью цвета фона. Тогда точно можно будет рисовать и стирать с 'верхней' формы не трогая изображения.

Добавлено через 2 минуты
И совсем страшная идея:
Над изображением создать еще одну форму, но без бордюр и с прозрачностью цвета фона. Тогда точно можно будет рисовать и стирать с 'верхней' формы не трогая изображения.
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
28.12.2009, 23:09  [ТС]
Цитата Сообщение от body90 Посмотреть сообщение
С тормозами я тоже сталкивался. Может переопределить событие перерисовки 'верхнего' объекта?
А это может помочь с тормозами? А почему?

Цитата Сообщение от body90 Посмотреть сообщение
И совсем страшная идея:
Над изображением создать еще одну форму, но без бордюр и с прозрачностью цвета фона. Тогда точно можно будет рисовать и стирать с 'верхней' формы не трогая изображения.
Да, идейка страшновата немного... Не факт что через верхнюю форму будет просвечиваться нижняя. И мне кажется это уже извращение.

Ладно, если с этим не получится, есть же и другие способы выделить фрагмент рисунка. Ну например, нарисовать прямоугольник, в котором инвертировать цвета. Ну или что-то в этом роде. Нашла такую штуку - ControlPaint.FillReversibleRectangle, может с ней поиграться?

А вообще вся задача у меня состоит в том, чтобы пользователь выделил кусок графика и он увеличился бы в этом кусочке. Ну в смысле, например, выделили по шкале Х от 17 декабря 2008 по 28 декабря 2008, а я бы перерисовала график именно в этом промежутке. Может еще какие идеи будут?

Или это действительно сложно реализуется, или одно из двух...

Добавлено через 1 минуту
А мож не с pictureBox мутить, а с Bitmap, на котором все это рисуется?

Добавлено через 2 минуты
Или может подключать тяжелую артиллерию типа WinAPI? Что-то подобное тоже в инете встречала...
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
29.12.2009, 12:41
Появилась идея как сделать, но у моей студии уже "поехала крыша" от экспериментов. Как только реализую - выложу.

Или может подключать тяжелую артиллерию типа WinAPI? Что-то подобное тоже в инете встречала...
Когда делал, я еще не знал C# (и соответственно GDI) и на API это как-то получалось не сложно. А тут надо еще подумать.

Добавлено через 8 часов 50 минут
Как это ни странно, но у меня получилось. Хотя способом под названием 'вырезание гланд через жо...'.
Ночью уже не хватило сил зайти на форум, сегодня приеду домой и выложу свои извращения
0
 Аватар для Humanitis
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
29.12.2009, 13:07
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
 public class MyPictureBox : PictureBox
    {
        private bool _lmPress = false;
        private Rectangle _frame = new Rectangle();
 
 
        private void DrawFrame(Graphics gr)
        {
            gr.DrawRectangle(Pens.Black,this._frame);
        }
        protected override void  OnMouseDown(MouseEventArgs e)
         {
            //base.OnMouseClick(e);
            if (e.Button == MouseButtons.Left)
            {
                this._frame = new Rectangle(e.X,e.Y,0,0);
                this._lmPress = true;
            }
        }
        protected override void OnMouseMove(MouseEventArgs e)
        {
            //base.OnMouseMove(e);
            if (this._lmPress)
            {
                this._frame.Width = e.X - this._frame.X;
                this._frame.Height = e.Y - this._frame.Y;
                Invalidate();
            }
        }
        protected override void OnMouseUp(MouseEventArgs e)
        {
            //base.OnMouseUp(e);
            this._lmPress = false;
        }
        protected override void OnPaint(PaintEventArgs pe)
        {
            base.OnPaint(pe);
            DrawFrame(pe.Graphics);
        }
 
    }
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
29.12.2009, 15:48  [ТС]
Humanitis, а как же будет с моим битмапом? Разве прямоугольник не перекроет его?

body90, ага, давайте что там у Вас получилось. Я правда уже по-другому сделала - через ControlPaint.DrawReversibleFrame. Вобщем тоже вариант неплохой.
0
 Аватар для Humanitis
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
29.12.2009, 15:57
Цитата Сообщение от Лакшми Посмотреть сообщение
Humanitis, а как же будет с моим битмапом? Разве прямоугольник не перекроет его?
нет,не перекроет
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
29.12.2009, 16:56
Жаль, что опоздал(((
Вот:
Вложения
Тип файла: rar ImageSelection.rar (259.2 Кб, 243 просмотров)
2
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
29.12.2009, 17:00  [ТС]
Ну почему же опоздал? Я и Ваш вариант рассмотрю. Может он мне покажется самым интересным и правильным.

Спасибо большое!!!
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
29.12.2009, 17:03
Только выделение работает с верхнего-левого в нижний-правый угол. Иначе выскакивает исключение. Но это легко исправить поработав с координатами (из-за отрицательной длины выделения)
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
29.12.2009, 19:31  [ТС]
Ага, я уже заметила. Сама сегодня весь день боролась с этим, но с помощью ControlPaint.FillReversibleRectangle. Я когда выше сообщение писала, написала что использовала ControlPaint.DrawReversibleFrame, хотя использовала ControlPaint.FillReversibleRectangle. Пока писала, случайно в MSDN-е обнаружила DrawReversibleFrame.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.12.2009, 19:31
Помогаю со студенческими работами здесь

Накладывать рамку для фотографий в picturebox
Добрый всем день! Подскажите, как реализовать накладывании рамки, на фото, которое расположено в picturebox ??? чтобы потом можно было...

Как сделать свой стиль выделения в TextBox
Поясню вопрос, если непонятен: Обычно текст выделяется так: Но вот как сделать вот так?=) Подскажите пожалуйста.

Переместить рамку выделения без перемещения выделенной области?
Всегда спокойно двигал рамку, а тут вдруг она стала перемещаться вместе с содержимым. Что нажать? Спасибо.

Как сделать рамку?)
Подскажите как оформить исходную инфу в рамку, а то при выходе такая неурядица как только не пробовал уже int min = 0; int max =...

Как сделать рамку
Как сделать рамку как на ОЗОНЕ?? http://www.ozon.ru


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru