Навигация:
<< >> Оглавление Указатель
Текст С++

Полный исходный текст на языке C++ для библиотеки (DLL) с моделями блоков, открывающих модальные окна для настройки параметров с помощью вспомогательных объектов RDS. Библиотека содержит две модели:

  // Функция настройки через вспомогательные объекты RDS
  #include <windows.h>
  #include <math.h>
  #include <RdsDef.h>
  // Подготовка описаний сервисных функций
  
  #include <RdsFunc.h>

  //==========  ==========
  int WINAPI ( /*hinst*/,
                           unsigned long reason,
                           void* /*lpReserved*/)
  { if(reason==DLL_PROCESS_ATTACH) // Загрузка DLL
      { // Получение доступа к функциям RDS
        if(!GetInterfaceFunctions())
           // Сообщение: старая версия RDS
      }
    return 1;
  }
  //========= Конец главной функции =========

  //=========================================
  //= Пример блока с личной областью данных =
  //=========================================

  //====== Класс личной области данных ======
  class TTest1Data
  { public:
      int IParam;       // Целый параметр
      double DParam;    // Вещественный параметр
      int Setup(void);  // Функция настройки параметров 
      TTest1Data(void)  // Конструктор класса
        { IParam=0; DParam=0.0;
          (L"Область создана",L"TTest1Data",MB_OK);
        };
      ~TTest1Data()     // Деструктор класса
        { (L"Область удалена",L"TTest1Data",MB_OK);};
  };
  //=========================================

  //============= Модель блока ==============
  extern "C" __declspec(dllexport)
    int  Test1(int CallMode, // Режим вызова (событие в RDS)
                       BlockData, // Структура данных блока
                       /*ExtParam*/) // Доп.параметр (здесь не используется)
  { TTest1Data *data;
    switch(CallMode)
      { case :    // Инициализация
          BlockData->BlockData=new TTest1Data();
          break;
        case : // Очистка
          data=(TTest1Data*)(BlockData->BlockData);
          delete data;
          break;
        case :   // Функция настройки 
          data=(TTest1Data*)(BlockData->BlockData);
          return data->Setup();

      }
    return ;
  }
  //=========================================
  // Функция настройки параметров 
  //  
  //  
  //  
  int TTest1Data::Setup(void)
  {  window; // Идентификатор вспомогательного объекта 
     ok;            // Пользователь нажал "OK" 
    // Создание окна 
    window=(FALSE,-1,-1,"Ввод параметров");
    // Добавление полей ввода 
    (window,0,1,,
                   "Целый параметр:",80);
    (window,0,2,,
                   "Вещественный параметр:",80);
    // Занесение исходных значений в поля ввода 
    (window,1,,IParam);
    (window,2,,DParam);
    // Открытие окна 
    ok=(window,NULL);
    if(ok)
      { // Нажата кнопка OK - запись параметров обратно в блок 
        IParam=(window,1,);
        DParam=(window,2,);
      }
    // Уничтожение окна 
    (window);
    // Возвращаемое значение 
    return ok?:;
  }
  //========================================= 


  //=========================================
  //=             Генератор                 =
  //=========================================

  //====== Класс личной области данных ======
  class TTestGenData
  { public:
      int Type;             // Тип (0-sin,1-cos,2-прямоугольные)
      double Period;        // Период
      double Impulse;       // Длительность импульса

       Time; // Связь с динамической
                            // переменной времени

      int Setup(void);      // Функция настройки
      TTestGenData(void)    // Конструктор класса
        { Type=0; Period=1.0; Impulse=0.5;
          // Подписка на динамическую переменную времени
          Time=(RDS_DVPARENT,
                                        "DynTime",
                                        "D",
                                        TRUE);
        };
      ~TTestGenData(void)	// Деструктор класса
        { // Прекращение подписки
          (Time);
        };
  };
  //=========================================

  //==== Прототип функции обратного вызова окна настроек ====
  void  TestGenDataCheckFunc();

  //====== Функция редактирования параметров ======
  // 
  // 
  // 
  int TTestGenData::Setup(void)
  {  window; // Идентификатор вспомогательного объекта
     ok;            // Пользователь нажал "OK"
    // Создание окна
    window=(FALSE,-1,-1,"Простой генератор");
    // Добавление полей ввода
    (window,0,1,,
                   "Вид:",210);
    (window,0,2,,
                   "Период:",80);
    (window,0,3,,
                   "Длительность:",80);
    // Установка списка вариантов
    (window,1,,
                    "Синус\nКосинус\nПрямоугольные импульсы");
    // Занесение исходных значений в поля ввода
    (window,1,,Type);
    (window,2,,Period);
    (window,3,,Impulse);
    // Открытие окна с указанием функции обратного вызова
    ok=(window,TestGenDataCheckFunc);
    if(ok)
      { // Нажата кнопка OK - запись параметров обратно в блок
        Type=(window,1,);
        Period=(window,2,);
        Impulse=(window,3,);
      }
    // Уничтожение окна
    (window);
    // Возвращаемое значение
    return ok?:;
  }

  //====== Функция обратного вызова для окна настроек ======
  void  TestGenDataCheckFunc( win)
  { // Считать номер пункта выпадающего списка
    int type=(win,1,);
    // Разрешить ввод длительности, если выбран пункт 2
    (win,3,,type==2);
  }
  //=========================================

  //============= Модель блока ==============
  extern "C" __declspec(dllexport)
    int  TestGen(int CallMode,
                         BlockData,
                         ExtParam)
  {
  // 
  #define pStart ((char *)(BlockData->VarTreeData))
  #define Start (*((char *)(pStart)))
  #define Ready (*((char *)(pStart+RDS_VSZ_S)))
  #define y (*((double *)(pStart+2*RDS_VSZ_S)))
    // Вспомогательная переменная – указатель на личную область
    // данных блока, приведенный к правильному типу
    TTestGenData *data;

    switch(CallMode)
      { // Инициализация
        case :
          BlockData->BlockData=new TTestGenData();
          break;

        // Очистка
        case :
          data=(TTestGenData*)(BlockData->BlockData);
          delete data;
          break;

        // Проверка типа переменных
        case :
          if(strcmp((char*)ExtParam,"{SSD}")==0)
            return ;
          return ;

        // Функция настройки
        case :
          data=(TTestGenData*)(BlockData->BlockData);
          return data->Setup();

        // Изменение динамической переменной или запуск расчета
        case :
        case :
          data=(TTestGenData*)(BlockData->BlockData);
          if(data->Period==0.0) // Нельзя вычислить частоту
            return 0;
          // Проверка наличия переменной “DynTime"
          if(data->Time!=NULL && data->Time->Data!=NULL)
            { // Динамическая переменная найдена – чтение значения
              double t=*((double*)data->Time->Data);
              switch(data->Type)
                { case 0: // Синус
                    y=sin(2*M_PI*t/data->Period);
                    break;
                  case 1: // Косинус
                    y=cos(2*M_PI*t/data->Period);
                    break;
                  case 2: // Прямоугольные импульсы
                    t=fmod(t,data->Period);
                    y=(t>data->Impulse)?-1.0:1.0;
                    break;
                }
              // Взвести Ready для передачи выхода по связям
              Ready=1;
            }
          break;
      }
    return ;
  // Отмена макроопределений
  #undef y
  #undef Ready
  #undef Start
  #undef pStart
  }
  //=========================================


<< >> Оглавление Указатель