|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
20.06.2010, 03:59 | #1 |
Пользователь
Регистрация: 10.02.2009
Сообщений: 33
|
Не вызывается OnDrawCell по нажатию правой кнопки мыши
Доброго времени суток всем!
Я увлекаюсь программированием микроконтроллеров, и изредка пишу для себя маленькие вспомогательные программки для ПК на Delphi. Теперь работаю с графическим LCD-дисплеем и подумал, что хорошо было бы написать программку, которая имитировала бы дисплей на экране ПК, в котором можно было бы рисовать (типа как в Paint) а нарисованное через юсб слать в микроконтроллер, чтобы он выводил на дисплей (нужно очень много и долго отлаживать шрифты, размер и цвет картинок и прочее, в коде прошивки это делать крайне неудобно). Использовал компоненты StringGrid для имитации LCD и для таблицы цветов в восьмибитном формате. Сделал, чтобы можно было выбирать цвет из самодельной палитры, и попиксельно рисовать им на "дисплее". Затем захотел добавить возможность использования фонового цвета (опять же, как в Paint) по нажатию правой кнопки мыши. И возникла проблема. Берётся цвет (и отображается на индикаторной панели цвета фона) сразу же по нажатию, а при нажатии правой кнопкой мыши на "дисплее" сразу не отображается. Приходится либо изменять масштаб "дисплея" (сделано программно), при этом происходит его перерисовка, либо тупо уводить окно с программой за пределы видимой зоны, при входе обратно опять же перерисовывается и цвета отображаются. Не могу понять, в чём дело, вроде бы всё тривиально, гугление и поиск по форуму не помогли, не нашёл ничего подобного. Вот код обработки нажатия кнопки мыши на импровизированный дисплей: Код:
Код:
Код:
Буду очень благодарен за помощь, сам уже не могу понять, почему по проверке условия, какая кнопка мыши нажата, если левая то всё нормально, а если правая, то сам цвет ложится в массив, но канвас не перерисовывается. Последний раз редактировалось shumsheec; 20.06.2010 в 04:06. |
20.06.2010, 08:05 | #2 |
Участник клуба
Регистрация: 11.01.2009
Сообщений: 1,917
|
Тут немного по-хитрому надо.
Сначала нужно "выловить" ячейку по которой кликнули правой мышкой... А потом в самом обработчике OnDrawCell смело проверять текущую рисующуюся ячейку на предмет сходства по номеру с той по которой кликнули и рисовать там по нужному алгоритму... Итак, введем глобальные переменные Код:
Код:
Код:
Спрашивай.
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Последний раз редактировалось Kotofff; 20.06.2010 в 08:13. Причина: Ошибся ... |
20.06.2010, 14:05 | #3 |
Пользователь
Регистрация: 10.02.2009
Сообщений: 33
|
Большое спасибо!
Помогла просто даже эта строчка: Код:
Буду обращаться ещё, скорее всего, так как в планах создать миниатюрный графический редактор под собственные нужды. Ваш код беру целиком на заметку, пригодится! |
20.06.2010, 14:10 | #4 |
Участник клуба
Регистрация: 11.01.2009
Сообщений: 1,917
|
Ну если понадоблюсь - я тут почти всегда...
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
|
08.07.2010, 03:09 | #5 |
Пользователь
Регистрация: 10.02.2009
Сообщений: 33
|
Появилась новая необходимость. Как зафиксировать в событии OnMouseMove, что нажата правая или левая кнопка мыши (чтобы при перемещении мыши рисовать линию и т.д.)? Или можно как-то по другому это сделать, в смысле рисовать линии а не отдельные точки?
Дело сдвинулось - обрабатываю Код:
Последний раз редактировалось shumsheec; 08.07.2010 в 03:59. Причина: догуглил |
08.07.2010, 15:23 | #6 |
Участник клуба
Регистрация: 11.01.2009
Сообщений: 1,917
|
Посмотри пример.
Спрашивай.
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
|
15.08.2010, 14:44 | #7 |
Пользователь
Регистрация: 10.02.2009
Сообщений: 33
|
Kotofff, разобрался в вашем примере, спасибо. Чуть-чуть не подходит, потому как не "запоминаются" старые ячейки, хотя работает быстро.
Возник очередной вопрос - как раскрасить другим цветом выделенные ячейки? Вот мой текущий обработчик OnDrawCell Код:
И вообще, я уже думаю что стринггрид неоптимален для модели дисплея. Тысячи ячеек получаются, и обрабатывать их долго. А что правильно использовать? Мне нужна масштабируемость (то есть надо чтобы "пикселы" можно было делать размером как 50*50, так и 1*1); чтобы к каждому пикселу можно получить простой доступ и назначить для каждого свой цвет. Какой компонент может это обеспечить? Или может можно как-нибудь "заставить" стринггрид не перерисовываться полностью каждый раз, а лишь перерисовываь ячейки, которые изменили свой цвет? |
15.08.2010, 15:23 | #8 |
Пользователь
Регистрация: 10.02.2009
Сообщений: 33
|
Второй раз уже на этом форуме задаю вопрос и почти сразу нахожу ответ, ещё немного поискав
В-общем, завёл четыре переменные, в которые в обработчике движения мыши по стринггриду складываю координаты выделенной области и в обработчике отрисовки по условию Код:
Остался вопрос по выбору более оптимального компонента, может быть кто-то делал мини-графические редакторы под свои нужды, подскажет.. Последний раз редактировалось shumsheec; 15.08.2010 в 15:24. Причина: раскинул условие на три строки |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как заставить программу показывать значения по нажатию кнопки мыши | xRamzeSx | Общие вопросы Delphi | 5 | 17.02.2010 14:03 |
Как(чем) удалить пункты из меню, которое появляется при нажатии правой кнопки мыши? | TwiX | Свободное общение | 13 | 11.11.2009 13:53 |
вывод сообщении только на правой кнопки мыши! | KWN, lnc | Общие вопросы Delphi | 1 | 21.03.2009 08:26 |
Косяки с правой кнопкой мыши | joker | Общие вопросы Delphi | 4 | 12.11.2008 13:25 |
как вызвать по нажатию кнопки меню настройки клавиатуры, мыши, монитора | 1234 | Общие вопросы Delphi | 2 | 10.09.2008 16:52 |