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

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

  // Открытие модального окна в режиме расчета
  #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;
  }
  //========= Конец главной функции =========


  //====== Неправильная модель блока ========
  //=== (открытие окна остановит расчет) ====
  extern "C" __declspec(dllexport)
    int  ModalWindowTestBad(int CallMode,
                                 BlockData,
                                 ExtParam)
  {
  // 
  #define pStart ((char *)(BlockData->VarTreeData))
  #define Start (*((char *)(pStart)))
  #define Ready (*((char *)(pStart+RDS_VSZ_S)))
  #define Color (*((RDSINT32 *)(pStart+2*RDS_VSZ_S)))
    // Вспомогательная структура для работы с диалогом цвета
    CHOOSECOLOR cc;
    // Массив дополнительных цветов для диалога
    static  CustomColors[16]=
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    // Возвращаемое функцией модели значение
    int result=;
    // Вспомогательная переменная – результат вызова диалога
     ok;

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

        // Функция настройки или нажатие кнопки мыши 
        case :
        case :
          // Установка параметров структуры для работы с диалогом
          memset(&cc,0,sizeof(cc));
          cc.lStructSize=sizeof(cc);
          cc.hwndOwner=();
          cc.lpCustColors=CustomColors;
          cc.rgbResult=Color;
          cc.Flags=CC_RGBINIT;
          // Уведомление RDS об открытии модального окна
          (NULL);
          // Вызов диалога
          ok=ChooseColor(&cc);
          // Уведомление RDS о закрытии модального окна
          (NULL);
          if(ok) // Пользователь выбрал цвет
            { // Запись цвета в Color
              Color=cc.rgbResult;
              if(CallMode==) // Функция настройки 
                { // Установка этого значения Color по умолчанию
                  // (2 – порядковый номер переменной Color в блоке)
                  (BlockData->Block,2);
                  // Возвращаемое значение должно сигнализировать
                  // о наличии изменений в схеме
                  result=;
                }
              else // Нажатие кнопки мыши 
                // Нужно перерисовать окно подсистемы 
                (BlockData->Parent,FALSE);
            }
          break;
      }
    return result;
  // Отмена макроопределений
  #undef Color
  #undef Ready
  #undef Start
  #undef pStart
  }
  //=========================================


  //======= Правильная модель блока =========
  //== (открытие окна не остановит расчет) ==
  // Функция вызова диалога 
  int  ModalWindowTest2Callback( data)
  {
    return ChooseColor((CHOOSECOLOR*)data);
  }
  //=========================================
  // Собственно модель блока
  extern "C" __declspec(dllexport)
    int  ModalWindowTest2(int CallMode,
                                 BlockData,
                                 ExtParam)
  {
  // 
  #define pStart ((char *)(BlockData->VarTreeData))
  #define Start (*((char *)(pStart)))
  #define Ready (*((char *)(pStart+RDS_VSZ_S)))
  #define Color (*((RDSINT32 *)(pStart+2*RDS_VSZ_S)))
    // Вспомогательная структура для работы с диалогом цвета
    CHOOSECOLOR cc;
    // Массив дополнительных цветов для диалога
    static  CustomColors[16]=
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    // Возвращаемое функцией модели значение
    int result=;
    // Вспомогательная переменная – результат вызова диалога
     ok;

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

        // Функция настройки или нажатие кнопки мыши
        case :
        case :
          // Установка параметров структуры для работы с диалогом
          memset(&cc,0,sizeof(cc));
          cc.lStructSize=sizeof(cc);
          cc.hwndOwner=();
          cc.lpCustColors=CustomColors;
          cc.rgbResult=Color;
          cc.Flags=CC_RGBINIT;
          // Уведомление RDS об открытии модального окна
          (NULL);
          // Вызов диалога
          if(()) // Идет расчет 
            { // Вызов со снятием блокировки 
              int ret;
              (ModalWindowTest2Callback,&cc,&ret);
              ok=ret;
            }
          else // Режим редактирования или моделирования 
            ok=ChooseColor(&cc);
          // Уведомление RDS о закрытии модального окна
          (NULL);
          if(ok) // Пользователь выбрал цвет
            { // Запись цвета в Color
              Color=cc.rgbResult;
              if(CallMode==) // Функция настройки
                { // Установка этого значения Color по умолчанию
                  // (2 – порядковый номер переменной Color в блоке)
                  (BlockData->Block,2);
                  // Возвращаемое значение должно сигнализировать
                  // о наличии изменений в схеме
                  result=;
                }
              else // Нажатие кнопки мыши
                // Нужно перерисовать окно подсистемы
                (BlockData->Parent,FALSE);
            }
          break;
      }
    return result;
  // Отмена макроопределений
  #undef Color
  #undef Ready
  #undef Start
  #undef pStart
  }
  //=========================================


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