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

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

В каждой следующей версии модели изменения относительно предыдущей версии выделены цветом.

  // Реакция на мышь
  #include <windows.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 RDSCALL PlusMinus(int CallMode,
                       BlockData,
                       ExtParam)
  {
  // 
  #define pStart ((char *)(BlockData->VarTreeData))
  #define Start (*((char *)(pStart)))
  #define Ready (*((char *)(pStart+RDS_VSZ_S)))
  #define v (*((RDSINT32 *)(pStart+2*RDS_VSZ_S)))
    // Вспомогательная — указатель на структуру события мыши
     mouse;

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

        // Реакция на нажатие кнопки мыши
        case :
          // Приведение ExtParam к нужному типу
          mouse=()ExtParam;
          if(mouse->Button==)
            { // Нажата левая кнопка
              if(mouse->y<mouse->Top+mouse->Height/2)
                v++; // В верхней половине блока - увеличиваем
              else
                v--; // В нижней половине блока — уменьшаем
              // Взводим сигнал готовности
              Ready=1;
            }
          break;
      }
    return ;
  // Отмена макроопределений
  #undef v
  #undef Ready
  #undef Start
  #undef pStart
  }
  //=========================================


  // Увеличение/уменьшение значения по щелчку - второй вариант
  // (распознается щелчок по элементам картинки)
  extern "C" __declspec(dllexport)
    int RDSCALL PlusMinus_a(int CallMode,
                       BlockData,
                       ExtParam)
  {
  // 
  #define pStart ((char *)(BlockData->VarTreeData))
  #define Start (*((char *)(pStart)))
  #define Ready (*((char *)(pStart+RDS_VSZ_S)))
  #define v (*((RDSINT32 *)(pStart+2*RDS_VSZ_S)))
    // Вспомогательная — указатель на структуру события мыши
     mouse;

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

        // Реакция на нажатие кнопки мыши
        case :
          // Приведение ExtParam к нужному типу
          mouse=()ExtParam;
          if(mouse->Button==)
            { // Нажата левая кнопка
              // Проверяем, есть ли у блока картинка (получаем описание блока)  
               descr;                                       
              descr.servSize=sizeof(descr);                                     
              (BlockData->Block,&descr);                  
              if(descr.Flags & )                              
                { // Картинка есть – определяем идентификатор                   
                  // элемента под курсором                                      
                  int id=(mouse);                            
                  switch(id)                                                    
                    { case 1:  v++; break;                                      
                      case -1: v--; break;                                      
                    }                                                           
                }                                                               
              else if(mouse->y<mouse->Top+mouse->Height/2)
                v++; // В верхней половине блока - увеличиваем
              else
                v--; // В нижней половине блока — уменьшаем
              // Взводим сигнал готовности
              Ready=1;
            }
          break;

      }
    return ;
  // Отмена макроопределений
  #undef v
  #undef Ready
  #undef Start
  #undef pStart
  }
  //=========================================


  // Увеличение/уменьшение значения по щелчку - третий вариант
  // (распознается щелчок по элементам картинки, идентификатор элемента определяет приращение v)
  extern "C" __declspec(dllexport)
    int  PlusMinus_b(int CallMode,
                       BlockData,
                       ExtParam)
  {
  // 
  #define pStart ((char *)(BlockData->VarTreeData))
  #define Start (*((char *)(pStart)))
  #define Ready (*((char *)(pStart+RDS_VSZ_S)))
  #define v (*((RDSINT32 *)(pStart+2*RDS_VSZ_S)))
    // Вспомогательная — указатель на структуру события мыши
     mouse;

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

        // Реакция на нажатие кнопки мыши
        case :
          // Приведение ExtParam к нужному типу
          mouse=()ExtParam;
          if(mouse->Button==)
            { // Нажата левая кнопка
              // Проверяем, есть ли у блока картинка (получаем
              // описание блока)
               descr;
              descr.servSize=sizeof(descr);
              (BlockData->Block,&descr);
              if(descr.Flags & )
                { // Картинка есть – определяем идентификатор
                  // элемента под курсором
                  int id=(mouse);
                  v+=id;  
                }
              else if(mouse->y<mouse->Top+mouse->Height/2)
                v++; // В верхней половине блока - увеличиваем
              else
                v--; // В нижней половине блока — уменьшаем
              // Взводим сигнал готовности
              Ready=1;
            }
          break;

      }
    return ;
  // Отмена макроопределений
  #undef v
  #undef Ready
  #undef Start
  #undef pStart
  }
  //=========================================


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