![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
Господа, программирую устройство с тачскрином.
Сразу скажу - пишу в среде CodeVision AVR, если кто знает. Поэтому решение должно быть реализовано элементарным С языком, без всяких наворотов типа std::vector (уж не помню как пишется). Суть такова - человек касается пальцем экрана, получаются координаты X и Y. В идеале хочу получить индивидуальный номер кнопки на которую нажали, плюс информацию о том, что по нажатию этой кнопки делать (типа кода операции). Вся проблема в том, что у меня как бы несколько "рабочих столов" и анализировать коориднаты нажатия нужно в зависимости от номера рабочего стола, а номера у них имеются. В принципе, как сделать чтобы хотя бы работало, я знаю, но хочется получить удобный для дальнейшего развития программы массив данных, ибо я пока только скелет строю, а потом придет заказчик и будем "мясо" наращивать. КРоме того, я понимаю, что изобретаю велосипед, и наверняка более рациональные чем я сейчас могу придумать, решения существуют. Пока у меня два варианта - 3-хмерный массив типа
В функции хочу передавать координаты нажатия и номер рабочего стола Dsk, чтобы функция сравнивала не находится ли X,Y в пределах массива координат, записанного в MAP[Dsk][0..n]. А код операции сделаю пятым элементом массива координат кнопки. Другой вариант - создать тип данных типа Button c полями x,y,x1,y1,opCode, далее массив Desktop состоящий из Button, массив ProgramData состоящий из Desktop. Как лучше, рациональнее для компилятора (у меня AVR на 16 МГц, а не Core i7), да и памяти оперативной 2кб. Или есть более рациональный наработанный способ? Это сообщение отредактировал(а) =Женек= - 5.1.2011, 18:50 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Сделайте одномерный массив структур. В каждой структуре должен описываться элемент управления (1 шт). Так же в ней должны задаваться границы "рабочих столов". Программа должна в run-time искать нужный "рабочий стол" и уже в нем искать нужный элемент управления.
|
|||
|
||||
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
Идею понял не до конца...
ВОт исходные - координаты нажатия... дальше по вашему что? Одномерный массив? но столы во многом одинаковы, одни и те же координаты будут соответствовать кнопкам в различных окнах. ПРо границы рабочего стола не понял. Я пока что взял первый вариант - создал 3-мерный массив координат - 3 стола, 10 кнопок, 4 координаты. В runtime определяю что за стол (desk) и шерстю MAP_COORDS[desk][i]. Сделал инициализацию массива колоночками с комментариями, проблем вроде нет, но есть ощущение топорности того, что я делаю. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
разделите этот массив на составляющие.. т.е. создайте отдельно структуры стол, кнопка и т.д. какой именно подход выбирать зависит от дальнейших планов.. если намериваетесь сделать нечто сложнее чем , просто стол и кнопка , то тогда сразу прикручивайте полиморфизм.. а вобще прежде стоило бы ознакомиться с подходами уже примененных в ГУИ библиотеках.. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Объясняю до конца.
Добавлено @ 11:08 PS. Ваш вариант с 3х мерным массивом сожрет очень много памяти Это сообщение отредактировал(а) xvr - 6.1.2011, 11:10 |
|||
|
||||
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
Хех... я все-таки после мытарств пришел к необходимости создания структуры. Спасибо за код, именно то, что я хотел, сейчас вникну.
А пока что вопрос - если я правильно понял, при поиске перебираются все кнопки в массиве. Не загрузит ли проц? Второе - что такое END_ID я так и не понял, да и вообще, как вы ROOM_ID и Button ID совмещаете в одной переменной.. P.S. не сочтите за твердолобость и лень, скорее всего и сам разберусь, пока вы ответите, но хотелось бы все же слышать объяснение и от вас. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
не в одной , внимательнее к комментариям конец значимой информации.. чтоб не использовать размер массива.. Добавлено через 2 минуты и 3 секунды
а сколько примерно кнопок то предполагается? 10 -15 про стол? не загрузит |
|||
|
||||
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
Как и говорил - разобрался, огромное спасибо! Единственное, что изменил - координаты не char а int сделал, у меня дисплей 800х480.
А вот с общими для всех окон кнопками - это конечно ГЕНИАЛЬНО. Сам когда продумывал код решил от этого отказаться и сделать просто общий код операции для одних и тех же кнопок на разных столах. Спасибо. |
|||
|
||||
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
Более того, у меня есть "подокна", которые тоже как-то надо идентифицировать, причем с удобствами. А здесь у окна не просто номер в массиве а ID, и я могу сделать окно 1, а подокна 11,12...
В общем спасибо, сам бы я до такого не дошел... |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
| =Женек= |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
Еще вопрос - объясните мне, как понять вот эту строку
особенно вот этот участок: is_active=(btn->x & BIT(room_id))!=0; Одновремено и присвоение и сравнение... Наткнулся я на это после того как подокна сделал
Кнопки с id 103 и 104 - для перемещения между подконами, то есть в первом окне только кнопка вперед, во втором - обе кнопки, в последнем - только кнопка назад. А тачпанель реагирует на обе кнопки в любом подразделе. Я переделал заголовок на
А как изменить мудреный (для меня, любителя) синтаксис функции, чтобы она учитывала и номер подокна? Заранее спасибо. |
||||||
|
|||||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
if (btn->id==ROOM_ID) : Если текущий элемент - идентификатор комнаты (room ID), то ... is_active=(btn->x & BIT(room_id))!=0; во флаг 'is_active' присваивается результат сравнения (bool величина - 1 или 0) с нулем результата логического И битовой маски из room_id из параметра и шкалы этих же room_id из текущего элемента. Т.е. is_active установится в 1 если текущий room_id (из параметра) присутствует в маске (в текущем элемента массива), или в 0 в противном случае. is_active равное 0 блокирует обработку кнопок в массиве У вас room_id у обоих подразделов равны 0, а подраздел не проверяется
Добавить в условие -
|
||||
|
|||||
| =Женек= |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
Спасибо... Сделал как написали - перестали жаться кнопки 101 и 102 ( в секции // common buttons for all 3 rooms)
Я переделал, добавил битовую маску в y:
Кнопки стали нажиматься, но стало выводиться не то окно. Стало выводиться как раз несуществующее окно с параметрами этой секции (то есть программа нарисовала 2 кнопки, а координаты нажатия определила по этим двум общим кнопкам. Да, забыл сказть, что проблема только для окна room=0,sub_room=0. С остальными окнами проблемы нет. Вывожу окошко так: 1. Программа анализирует room и sub_room, лезет в массив, ищет секцию с подходящую под номера room и sub_room. 2. В зависимости от того, сколько кнопок находит (при подсчете кнопки 101,102,103, 104 пропускаются) выводит их на экран соответствующм кодом (расположение кнопок на экране зависит от их количества и варианта расположения 4).
Но программа сразу цепляется за {ROOM_ID,BIT(0)|BIT(1)|BIT(2)|BIT(3)|BIT(4)|BIT(5),BIT(0)|BIT(1)|BIT(2)|BIT(3)|BIT(4)|BIT(5)}, // common buttons for all 3 rooms думая, что нашла окно с параметрами room=0, sub_room=0. С остальными окнами проблемы нет. |
||||
|
|||||
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
Ларчик просто открывался. Заменил & на == в
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Это неправильно. Оригинальный вариант позволял задать набор одних и тех же кнопок для набора окон. В варианте == наборы работать не будут
Правильно цепляется - вы же ей сами написали BIT(0) в room_id и в subroom_id (x и y) Весьма странный способ рисования кнопок Стоит данные для рисования кнопок засунуть в тот же массив, а не пытаться вычислить расположение звезд по количеству астрономов, их наблюдающих |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |