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

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

  // Мигающий и вращающийся блок
  #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;
  }
  //========= Конец главной функции =========

  //=== Структура личной области данных =====
  struct TRotateFlashData
  {  FlashTimer; // Таймер мигания
     RotTimer;   // Таймер вращения
  };
  //============= Модель блока ==============
  extern "C" __declspec(dllexport) int  RotateFlash(
          int CallMode,
           BlockData,
           ExtParam)
  {
  // 
  #define pStart ((char *)(BlockData->VarTreeData))
  #define Start (*((char *)(pStart)))
  #define Ready (*((char *)(pStart+RDS_VSZ_S)))
  #define Flash (*((char *)(pStart+2*RDS_VSZ_S)))
  #define Rotate (*((char *)(pStart+2*RDS_VSZ_S+RDS_VSZ_L)))
  #define State (*((char *)(pStart+2*RDS_VSZ_S+2*RDS_VSZ_L)))
  #define Angle (*((double *)(pStart+2*RDS_VSZ_S+3*RDS_VSZ_L)))
    // Вспомогательная переменная – указатель на личную область
    TRotateFlashData *data=(TRotateFlashData*)(BlockData->BlockData);
    // Структура для получения параметров таймера
     descr;

    switch(CallMode)
      { // Инициализация блока
        case :
          // Отведение памяти под личную область
          BlockData->BlockData=data=new TRotateFlashData;
          // Создание двух одинаковых таймеров
          data->FlashTimer=(NULL,0,
            |,FALSE);
          data->RotTimer=(NULL,0,
            |,FALSE);
          break;

        // Очистка данных блока
        case :
          // Уничтожение таймеров
          (data->FlashTimer);
          (data->RotTimer);
          // Освобождение памяти, занятой под личную область
          delete data;
          break;

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

        // Такт расчета
        case :
          // Подготовка структуры descr к чтению данных таймера
          descr.servSize=sizeof(descr);
          // Управление миганием
          (data->FlashTimer,&descr);
          if(Flash) // Включить мигание
            { if(!descr.On) // Таймер остановлен
                { // Запускаем таймер и “зажигаем" индикатор
                  (data->FlashTimer,1000);
                  State=1;
                }
            }
          else // Выключить мигание
            { if(descr.On) // Таймер работает
                { // Останавливаем и “гасим" индикатор
                  (data->FlashTimer);
                  State=0;
                }
            }
          // Управление вращением
          (data->RotTimer,&descr);
          if(Rotate) // Включить врашение
            { if(!descr.On) // Таймер остановлен – запускаем
                (data->RotTimer,100);
            }
          else // Выключить вращение
            { if(descr.On) // Таймер работает – останавливаем
                (data->RotTimer);
            }
          break;

        // Срабатывание таймера
        case :
          // Сравниваем с имеющимися таймерами
          if(ExtParam==(()data->FlashTimer))
            // Это – таймер мигания
            State=!State;
          else // Если не таймер мигания, значит, вращения
            Angle=fmod(Angle+0.4,2*M_PI);
          break;
      }
    return ;

  // Отмена макроопределений для переменных
  #undef Angle
  #undef State
  #undef Rotate
  #undef Flash
  #undef Ready
  #undef Start
  #undef pStart
  }
  //=================================================


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