Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
5 / 5 / 2
Регистрация: 29.08.2012
Сообщений: 46

Мышь в виде перекрестия на весь PaintBox (Image)

27.01.2016, 16:12. Показов 5770. Ответов 58
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Использую PaintBox, но можно поговорить и об Image, т.к. почти одно и тоже)
Задача в следующем:

На своём PaintBox (далее PB) сверху (примерно 80% его высоты) у меня отведено под некий график, а в нижней части PB (20%) я вывожу другой график, который идейно связан с верхним. Т.е. каждая точка на нижнем графике "рассказывает" пользователю о состоянии соответствующей точки верхнего графика. Но зрительно проводить вертикаль между далеко отстоящими друг от друга графиками не всем пользователям позволит косоглазие ))) Поэтому возникла идея превратить мышь в вертикаль на всю картинку, которая будет точно показывать, какая точка нижнего графика соответствует какой точке верхнего. Ну, а горизонталь за компанию: значение оси Y показывать будет... хотя особой необходимости в ней нет... так что если от этого зависит решение, то горизонталью я готов пожертвовать )))

Можно использовать OnMouseMove и рисовать линии на PB. Но если перерисовывать всю картинку при каждом движении мышки на 1 пиксель - то PB нереально дёргается (как мониторы компьютеров, которые показывают по телевизору, только быстро), программа иногда вылетает, да и вообще, выглядит это не эстетично и ужасно...

Возникла идея создавать новый огромный курсор мыши в виде креста (ведь он не связан графически с PB и своим перемещением зарисовывать изображение на нём не будет). А поскольку расстояния от перекрестия до границ PB всегда будут разными, то создавать этот курсор надо каждый раз новый в OnMouseMove, а не просто загрузить курсор из файла размером в три монитора ))). Может, кто-то знает, как это сделать? Или у кого-то будет оригинальное гениальное решение? Смысл в том, чтоб рисовать крест не на PB и не удалять его, восстанавливая изображение под ним, после того, как мышь ушла в другое место. Заранее, спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.01.2016, 16:12
Ответы с готовыми решениями:

Скопировать картинку с PaintBox в Image
Помогите, пожалуйста. Нужно скопировать картинку с PaintBox в Image. C помощью CopyRect не получается.

Графические компоненты Image, Shape, Chart, PaintBox
Написать программу: Организовать выбор способа задания параллелограмма из списка: - по двум сторонам и углу между ними, - по двум...

Image во весь экран
Подскажите, как прописать чтобы изображение было на весь экран? то есть вообще форма скрывается и картина по всему экрану.

58
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.01.2016, 16:57
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Kvarcenar Посмотреть сообщение
Я ж говорю, если перерисовывать всю картинку при каждом движении мышки на пиксель - то вся картинка дёргается сильно.
DoubleBuffered = true должен гасить.
0
5 / 5 / 2
Регистрация: 29.08.2012
Сообщений: 46
28.01.2016, 17:05  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
DoubleBuffered = true должен гасить.
Цитата Сообщение от Kvarcenar Посмотреть сообщение
Не помогает... И где эту строку писать? Я в событии FormActivate написал...
ну, и перед прорисовкой в онмаусмуве тоже пробовал.. и в онпэинте.. без изменений..
Друг предложил версию, что помогает в более новом билдере.. у меня 6-й..
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.01.2016, 23:15
Цитата Сообщение от Kvarcenar Посмотреть сообщение
Друг предложил версию, что помогает в более новом билдере.. у меня 6-й..
Кстати да я когда-то делал такую штуку студенту
Видео

Тоже помню из-за чего-то B6 тоже подлагивало в отличие от XE3
0
5 / 5 / 2
Регистрация: 29.08.2012
Сообщений: 46
29.01.2016, 01:31  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Тоже помню из-за чего-то B6 тоже подлагивало
это ещё не лагает.. ))) может, потому что белый фон... у меня фон чёрный. и при каждой перерисовке моргает. Имидж - широкими белыми полосами сверху вниз проходит, а пэинтбокс - терпимо. иногда даже почти незаметно.. но проблема с перекрестием решилась, да ещё и картинка не исчезает.. ради мелкого неудобства с едва заметным морганием переходить на новую версию пока не дозрел.. )))
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.01.2016, 01:35
Так это TPainBox рисуется.
C TImage нужно иначе...
на TImage я делал https://www.cyberforum.ru/blog... og621.html - и работало нормально (на там правда быдлокод, ибо писал давно и много эксперементировал)

Нужно просто думать как прорисовывать так что бы с минимальной нагрузкой, и по меньше участок прорисовывать.

Не по теме:

Цитата Сообщение от Kvarcenar Посмотреть сообщение
новую версию пока не дозрел.. )))
Любители антикваритета...

0
5 / 5 / 2
Регистрация: 29.08.2012
Сообщений: 46
29.01.2016, 01:54  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
на TImage я делал...
Я с Имиджем тоже дружу. Когда-то писал расписание-бухгалтерию для студии звукозаписи - до сих пор пользуются:

думаете, СтрингГрид? Не-а! Имидж! тут ячейки можно разноцветными делать )))) а в СтрингГриде нельзя. А в Вашей проге чё ему дёргаться? Вы ж его не перерисовываете по ОнМаусМув. А у меня поток рисует и обновляет в реальном времени. А по ОнМаусМув комменты для каждой точки выводятся разные текстом на картинке.. хотя, как Вы там ярлыки по рабочему столу тягаете - не знаю... должно дёргаться... )))
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.01.2016, 02:00
Цитата Сообщение от Kvarcenar Посмотреть сообщение
думаете, СтрингГрид? Не-а! Имидж! тут ячейки можно разноцветными делать )))) а в СтрингГриде нельзя.
Думаю для этого есть DrawGrid, и кстати в TStringGrid тоже можно )))

Добавлено через 1 минуту
Цитата Сообщение от Kvarcenar Посмотреть сообщение
А у меня поток рисует и обновляет в реальном времени.
А понту? Таймер не?

P.S Я тоже когда-то подобную ерунду для расписания делал.
0
5 / 5 / 2
Регистрация: 29.08.2012
Сообщений: 46
29.01.2016, 02:03  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Думаю для этого есть DrawGrid
Пробовал.. Но не разобрался, как его цветным делать.. Сроки поджимали, поэтому долго не мучился - написал, как умел )))) Зато теперь можно хвастаться, что из фантиков парашют сделал ))))

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
А понту? Таймер не?
ну, в потоке дэлэй, разумеется.. или Вы о чём?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.01.2016, 02:05
Цитата Сообщение от Kvarcenar Посмотреть сообщение
ну, в потоке дэлэй, разумеется.. или Вы о чём?
Смысла нет, морока с синхронизацией... Лучше и проще таймером.
0
5 / 5 / 2
Регистрация: 29.08.2012
Сообщений: 46
29.01.2016, 12:54  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Лучше и проще таймером.
Ну, как же таймером? Запускать я его где буду, если не в потоке?

Добавлено через 4 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
таймером
это типа компонент такой? ща буду разбираться...

Добавлено через 3 минуты
Цитата Сообщение от Kvarcenar Посмотреть сообщение
ща буду разбираться.
капец... как всё просто.... )))) буду проверять на практике...

Добавлено через 10 часов 29 минут
Цитата Сообщение от Avazart Посмотреть сообщение
Лучше и проще таймером.
Попробовал таймер - штука классная, но не совсем подходит. Когда выполняется поток, то сколько бы времени ни заняло его выполнение (хоть вечный цикл туда запихни) - я могу в программе делать всё, что угодно: двигать окно, менять его размер, перерисовывать картинку, менять пользовательские параметры и т.д. А если работает таймер - то программа висит, пока он не закончит свою работу, и её даже закрыть нельзя. Так что пока что остаюсь в потоке. Но за таймер спасибо - узнал о новом компоненте )))
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.01.2016, 13:11
Цитата Сообщение от Kvarcenar Посмотреть сообщение
А если работает таймер - то программа висит, пока он не закончит свою работу, и её даже закрыть нельзя.
А у вас там большая работа? Как бы сама прорисовка все равно должна идти с синхронизацией с основным потоком.
0
5 / 5 / 2
Регистрация: 29.08.2012
Сообщений: 46
29.01.2016, 13:37  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
А у вас там большая работа?
Ну, не то, чтобы очень... Основная работа - это рисование. Ещё он получает данные из соседнего приложения (по CopyMemory), ну и по мелочи там. Просто, на рисунке много информации, и в зависимости от настроек пользователя (что туда выводить и с какой детализацией) время рисования бывает разным. На ВПС иногда больше секунды рисует.. (подозреваю, из-за убитой на ВПС графики) и это неудобно получается.. сидишь, водишь перекрестием по рисунку, присматриваешься, что там к чему, а оно бац - и повисло на полсекунды - неприкольно.. а с потоком такого нет. Он из памяти данные получил - и даже если рисунок не нарисовался, то координаты мыши уже рассчитываются по новым данным и некоторую информацию уже видно в статусбаре, да и отсутствие тормозов не так нервирует..
Цитата Сообщение от Avazart Посмотреть сообщение
Как бы сама прорисовка все равно должна идти с синхронизацией с основным потоком.
А что там синхронизировать? Есть глобальная булевая переменная - индикатор работы очередной итерации рисования. И пока рисование активно - доступ к функциям рисования другим баттонам и маусмувам запрещён. Так я частично избавился от упомянутого в теме вылета программы из-за ошибки "отказано в доступе" ))) А что ему ещё надо? Рисует себе в фоне - и пусть рисует )))
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.01.2016, 14:00
Цитата Сообщение от Kvarcenar Посмотреть сообщение
Основная работа - это рисование.
Ну так рисовать можно только в основном потоке как не крути.
Т.е. синхронизация сводит весь выигрыш от потока на нет.

Добавлено через 1 минуту
Цитата Сообщение от Kvarcenar Посмотреть сообщение
А что там синхронизировать? Есть глобальная булевая переменная - индикатор работы очередной итерации рисования. И пока рисование активно - доступ к функциям рисования другим баттонам и маусмувам запрещён. Так я частично избавился от упомянутого в теме вылета программы из-за ошибки "отказано в доступе" ))) А что ему ещё надо? Рисует себе в фоне - и пусть рисует )))
Это туфта, будет падать. Нужно или через Synchronize или через блокировку канвы.

Как сделать "Старт", "Пауза", Стоп"?
0
5 / 5 / 2
Регистрация: 29.08.2012
Сообщений: 46
29.01.2016, 14:27  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
рисовать можно только в основном потоке
Ну, не знаю.. у меня рисует.. и поскольку все функции рисования я перенёс в событие ОнПэинт, то всё, что в программе способно рисовать вызывает это событие вот так: PaintBox1Paint(NULL); В его коде всё начинается с условия проверки глобальной переменной DrawProcFree, которая изменяется только в двух местах: в true при FormActivate и в самой
C++ (Qt)
1
2
3
4
5
6
7
8
9
TForm1::PaintBox1Paint(TObject *Sender)
{if (DrawProcFree)
 {DrawProcFree = false;
  ...
  // рисуем
  ...
  DrawProcFree = true;
 }
}
Поэтому пока кто-то рисует - никто другой рисовать не может. А поток у меня не такой, как у Вас в архиве. У меня _beginthreadex...
Цитата Сообщение от Avazart Посмотреть сообщение
Это туфта, будет падать. Нужно или через Synchronize или через блокировку канвы.
Ну, иногда вылетает, да.. Не знаю, почему.. Поискал темы о синхронизации, погуглил - иногда встречаются фразы типа "в данном случае синхронизация не нужна".. Почему будет падать и что такое канва?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.01.2016, 15:20
Цитата Сообщение от Kvarcenar Посмотреть сообщение
Почему будет падать и что такое канва?
По тому что это туфта @
а не синхронизация и падает именно по тому что ее нет...
Стоит во время перерисовки из потока подергать,потаскать форму мышкой и приложение виснет и падает.
Канва = Canvas

Добавлено через 3 минуты
Цитата Сообщение от Kvarcenar Посмотреть сообщение
У меня _beginthreadex...
Тем более, нужно использовать TThread который специально заточен на использования с VCL и имеет методы для синхронизации.
0
5 / 5 / 2
Регистрация: 29.08.2012
Сообщений: 46
29.01.2016, 15:32  [ТС]
Ок. Это моя первая серьёзная программа с потоком, поэтому я в потоках не особо шарю. Вы выше сказали, что синхронизация сведёт на "нет" преимущество потока. Так могу ли я как-то избавиться и от зависания (как в таймере), и от вылетов (как в потоке)? Просто, смысл сейчас заморачиваться с синхронизацией, если результат будет как в таймере?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.01.2016, 15:39
Цитата Сообщение от Kvarcenar Посмотреть сообщение
Так могу ли я как-то избавиться и от зависания (как в таймере)
Ну я не знаю почему у вас висит, вероятно нужно смотреть почему висит.
0
5 / 5 / 2
Регистрация: 29.08.2012
Сообщений: 46
29.01.2016, 16:19  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Ну я не знаю почему у вас висит, вероятно нужно смотреть почему висит.
Висит - если долго рисует. Ещё для сравнения с потоком вставлял вечный цикл вайл(тру), в котором i++; дэлэй(10); и эдит->текст=i; Поток прописывает в эдит каждое i, и с приложением можно проводить любые махинации. А таймер висит вечно, и эдит не меняется. И даже закрыть окно крестиком нельзя. Вот и делаю вывод, что на компе, на котором рисовать будет долго (как на ВПС, например), будет и висеть долго. А это не есть хорошо.

Добавлено через 26 минут
Цитата Сообщение от Kvarcenar Посмотреть сообщение
дэлэй
сорри, не дэлэй, а слип ))))
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
29.01.2016, 16:35
Sleep() - это вообще круто!! (типа: лучше не применять). А таймер сам собой не остановится; может из-за этого не выходит (раз вы с этим компонентом еще не работали). Для однократного применения в его обработчике в конце нужно прописать Timer1->Enabled = false; - тогда остановится.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.01.2016, 16:36
Вечный цикл?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.01.2016, 16:36
Помогаю со студенческими работами здесь

Как сместить Canvas в PaintBox не смещая PaintBox?
Как сместить например на 3 пикселя весь рисунок в PaintBox, не изменяя при этом размеров и позиции PaintBox?

Растянуть Image на весь Glyph SpeedButton-а
Такой кодdynamic_cast< TImage*>(Form13->FindComponent("I160"))->Width=SB->Width; dynamic_cast<...

Acronis True Image тоже весь жёсткий диск форматирует
Acronis True Image тоже ВЕСЬ жёсткий диск форматирует, если конфигурация разделов изменилась? Эта проблема появилась когда я везде...

Вывести весь текст словами в виде количественного числительного
Задано некоторое натуральное число k. Требуется вывести весь текст словами в виде количественного числительного, которое означает заданное...

Вывести весь текст словами в виде количественного числительного
Задано некоторое натуральное число k. Требуется вывести весь текст словами (например, при k=5 вывод имеет вид "пять", при k=123...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru