class TIndicator: public TFrame
{
published:[INDENT]
TTimer *Timer; // Таймер обновления индикатора
void __fastcall Timer_Event (TObject *Sender); // Обработчик таймера
[/INDENT]private:[INDENT]int _fVisible_Value; //Отображаемое значение параметра
int _fReal_Value; //Требуемое значение параметра
void Draw_Value (void); // Функция рисования стрелки
void Set_Real_Value (int Value);
[/INDENT]
public:
__property int Value = {read = _fReal_Value, write = Set_Real_Value}; // Свойство чтения/записи реального значения
};
void TIndicator::Set_Real_Value (int Value)
{[INDENT] if (_fReal_Value != Value)
{[INDENT]Timer->Enabled = true;
_fReal_Value = Value;[/INDENT]}
[/INDENT]}
TIndicator::Timer_Event (TObject *Sender)
{[INDENT]
if (_fVisible_Value < _fReal_Value)
_fVisible_Value++; // Перемещение стрелки на деление вперёд
else if (_fVisible_Value > _fReal_Value)
_fVisible_Value--; // Перемещение стрелки на деление назад
else
Timer->Enabled = false; // Остановка таймера
this->Draw_Value(); // Рисование стрелки на новом положении
[/INDENT]}
Датчики или симуляторы. Как?
У меня полное не понимание,как это сделать.
1. Есть два рисунка: циферблат и стрелка;
2. Стрелка НЕ должна быть рисованная, это должен быть обычный рисунок (это симулятор и все должно быть весьма реалистично);
3. Передвигаться она должна ПЛАВНО, как на циферблате, а не скакать с одной точки в другую.
4. Есть такой, уже готовый код, на XML, может кто знает какой-нить конвертор (вручную не напишу - XML не знаю);
5. Как наложить стрелку на циферблат соотнося центр оси вращения на циферблате и на стрелке? Привязка к координатам? Как? Тоже самое касается перехода на значение - делать привязку к координатам? Как?
6. Циферблат лучше делать как background или загружать прямо на форму?
Сенк.
Цитата:
3. Передвигаться она должна ПЛАВНО, как на циферблате, а не скакать с одной точки в другую.
Это можно сделать при помощи таймера
Код:
Код на XML? Ты ничего не путаешь? =))
Меню: "Файл"\"Создать"\"Фрейм". В проект добавляется новый юнит с формой.
Форма эта и есть фрейм - в редакторе форм указываются размеры компонента, добавляются объекты интерфейса и настраиваются их свойства. В .h-файле объявляются поля, методы и свойства фрейма, в .cpp-файле пишется реализация методов - в общем, как с формой.
После чего, переключаемся на форму программы, и на панели компонентов выбираем элемент Frame. В диалоговом окне указываем созданный нами класс фрейма.
Всё - объект расположен на форме и имеет имя, которое можно использовать в тексте программы
нет, не путаю. Привожу код (признаю честно, выдран из методички AVishа (Александр Вишняков) "Создание приборов для Microsoft Flight Simulator"):
Код:
Я приведу уже написанный мной код XML Указателя Скорости и числа М самолета Ту-160
и постараюсь кратко рассказать что где находится и для чего.
Итак, вот код моего прибора:
<Gauge Name="UsmIndicator" Version="1.0">
<!-- ver. 2004_06_03 AVish -->
<Image Name="usm_background.bmp" Luminous="Yes" ImageSizes="0,0,350,350" />
<Element><Position X="185" Y="185" />
<Image Name="usm_needle.bmp" PointsTo="North" Luminous="Yes" ImageSizes="0,0,148,21">
<Axis X="12" Y="11" />
</Image>
<Rotate>
<Value Minimum="0" Maximum="1400">(A:Airspeed indicated, knots) 1.852 *</Value>
<Failures>
<SYSTEM_PITOT_STATIC Action="0" />
<GAUGE_AIRSPEED Action="Freeze" />
</Failures><Nonlinearity><Item Value="0" X="200" Y="44" />
<Item Value="100" X="229" Y="50" />
<Item Value="200" X="278" Y="80" />
<Item Value="300" X="309" Y="136" />
<Item Value="400" X="312" Y="200" />
<Item Value="500" X="287" Y="259" />
<Item Value="600" X="244" Y="300" />
<Item Value="700" X="176" Y="314" />
<Item Value="800" X="106" Y="300" />
<Item Value="900" X="63" Y="259" />
<Item Value="1000" X="38" Y="200" />
<Item Value="1100" X="41" Y="136" />
<Item Value="1200" X="72" Y="80" />
<Item Value="1300" X="121" Y="50" />
<Item Value="1400" X="150" Y="44" />
</Nonlinearity> <Delay DegreesPerSecond="25" />
</Rotate>
</Element>
<Mouse>
<Help ID="HELPID_GAUGE_AIRSPEED" />
<Tooltip ID="TOOLTIPTEXT_AIRSPEED_KILOS" MetircID="TOOLTIPTEXT_AIRSPEED_KILOS" />
</Mouse>
</Gauge>
и постараюсь кратко рассказать что где находится и для чего.
Итак, вот код моего прибора:
<Gauge Name="UsmIndicator" Version="1.0">
<!-- ver. 2004_06_03 AVish -->
<Image Name="usm_background.bmp" Luminous="Yes" ImageSizes="0,0,350,350" />
<Element><Position X="185" Y="185" />
<Image Name="usm_needle.bmp" PointsTo="North" Luminous="Yes" ImageSizes="0,0,148,21">
<Axis X="12" Y="11" />
</Image>
<Rotate>
<Value Minimum="0" Maximum="1400">(A:Airspeed indicated, knots) 1.852 *</Value>
<Failures>
<SYSTEM_PITOT_STATIC Action="0" />
<GAUGE_AIRSPEED Action="Freeze" />
</Failures><Nonlinearity><Item Value="0" X="200" Y="44" />
<Item Value="100" X="229" Y="50" />
<Item Value="200" X="278" Y="80" />
<Item Value="300" X="309" Y="136" />
<Item Value="400" X="312" Y="200" />
<Item Value="500" X="287" Y="259" />
<Item Value="600" X="244" Y="300" />
<Item Value="700" X="176" Y="314" />
<Item Value="800" X="106" Y="300" />
<Item Value="900" X="63" Y="259" />
<Item Value="1000" X="38" Y="200" />
<Item Value="1100" X="41" Y="136" />
<Item Value="1200" X="72" Y="80" />
<Item Value="1300" X="121" Y="50" />
<Item Value="1400" X="150" Y="44" />
</Nonlinearity> <Delay DegreesPerSecond="25" />
</Rotate>
</Element>
<Mouse>
<Help ID="HELPID_GAUGE_AIRSPEED" />
<Tooltip ID="TOOLTIPTEXT_AIRSPEED_KILOS" MetircID="TOOLTIPTEXT_AIRSPEED_KILOS" />
</Mouse>
</Gauge>
У меня полное не понимание,как это сделать.
1. Есть два рисунка: циферблат и стрелка;
2. Стрелка НЕ должна быть рисованная, это должен быть обычный рисунок (это симулятор и все должно быть весьма реалистично);
3. Передвигаться она должна ПЛАВНО, как на циферблате, а не скакать с одной точки в другую.
4. Есть такой, уже готовый код, на XML, может кто знает какой-нить конвертор (вручную не напишу - XML не знаю);
[/quote]
Если тебе это поможет - XMLMapper :D
Правда чем - это вопрос. В приведенном тобой - это не код датчика - это данные которые он отображает и его координаты при этом. Без разницы в чем ты их будешь хранить.
Т.е. твоя задача - получить данные от пользователя, а затем считать координаты из базы, которые соответствуют этим данным.
[QUOTE=Lokky]
5. Как наложить стрелку на циферблат соотнося центр оси вращения на циферблате и на стрелке? Привязка к координатам? Как? Тоже самое касается перехода на значение - делать привязку к координатам? Как?
[/QUOTE]
Создать как минимум 2 класса - класс который просчитывает текущее положение стрелки по отношению к циферблату, и класс который рисует эту картинку в окне( я так понимаю что датчиков будет не один).
Цитата:
6. Циферблат лучше делать как background или загружать прямо на форму?
Сенк.
???? Более быстро - копировать и извлекать готовую картинку из буфера.
Цитата:
Создать как минимум 2 класса - класс который просчитывает текущее положение стрелки по отношению к циферблату, и класс который рисует эту картинку в окне( я так понимаю что датчиков будет не один).
Лучше объединить это в одном компоненте. Хотя за отдельные функции этого компонента могут быть реализованы во вложенных объектах.
Например, сам компонент реализует отображение стрелки, а принадлежащий ему объект определяет текущее положение для плавного перемещения.