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

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

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

//====== Класс личной области данных ====== class TPlusMinusData { public: int KeyPlus; // Клавиша увеличения ShiftsPlus; // и ее флаги int KeyMinus; // Клавиша уменьшения ShiftsMinus; // и ее флаги int Setup(void); // Функция настройки клавиш void SaveBin(void);// Сохранение параметров int LoadBin(void); // Загрузка параметров // Конструктор класса TPlusMinusData(void) { KeyPlus=ShiftsPlus=KeyMinus=ShiftsMinus=0;}; }; //=========================================
// Функция задания клавиш // // // int TPlusMinusData::Setup(void) { window; // Идентификатор вспомогательного объекта ok; // Пользователь нажал "OK" // Создание окна window=(FALSE,-1,-1,"Плюс/минус"); // Добавление полей ввода (window,0,1,, "Клавиша увеличения:",80); (window,0,2,, "Клавиша уменьшения:",80); // Занесение исходных значений кодов клавиш в поля ввода (window,1,,KeyPlus); (window,1,,ShiftsPlus); (window,2,,KeyMinus); (window,2,,ShiftsMinus); // Открытие окна ok=(window,NULL); if(ok) { // Нажата кнопка OK - запись кодов клавиш в класс KeyPlus=(window,1,); ShiftsPlus=(window,1,); KeyMinus=(window,2,); ShiftsMinus=(window,2,); } // Уничтожение окна (window); // Возвращаемое значение return ok?:; } //=========================================
// Сохранение параметров void TPlusMinusData::SaveBin(void) { tag; // Переменная для байта тега tag=1; // Тег 1 - клавиша увеличения (&tag,sizeof(tag)); (&KeyPlus,sizeof(KeyPlus)); (&ShiftsPlus,sizeof(ShiftsPlus)); tag=2; // Тег 2 - клавиша уменьшения (&tag,sizeof(tag)); (&KeyMinus,sizeof(KeyMinus)); (&ShiftsMinus,sizeof(ShiftsMinus)); tag=0; // Тег 0 - конец данных (&tag,sizeof(tag)); } //=========================================
// Загрузка параметров int TPlusMinusData::LoadBin(void) { tag; for(;;) // Цикл до тех пор, пока данные не кончатся { // Читаем байт тега if(!(&tag,sizeof(tag))) break; // Тег не считан - данные кончились // Анализируем считанный тег switch(tag) { case 0: // Конец данных блока return ; // Загрузка успешно завершена case 1: // Данные клавиши увеличения (&KeyPlus,sizeof(KeyPlus)); (&ShiftsPlus,sizeof(ShiftsPlus)); break; case 2: // Данные клавиши уменьшения (&KeyMinus,sizeof(KeyMinus)); (&ShiftsMinus,sizeof(ShiftsMinus)); break; default: // Неопознанный тег return RDS_BFR_ERROR; // Сообщаем RDS об ошибке } } // Данные кончились до тега 0 - сообщаем об ошибке return RDS_BFR_ERROR; } //=========================================
// Увеличение/уменьшение значения по щелчку и клавишам extern "C" __declspec(dllexport) int 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;
// Вспомогательная — указатель на структуру события клавиатуры key; // Указатель на личную область данных блока,приведенный к // правильному типу TPlusMinusData *data=(TPlusMinusData*)(BlockData->BlockData);
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;
case : // Инициализация BlockData->BlockData=new TPlusMinusData(); break; case : // Очистка данных delete data; break; case : // Настройка параметров return data->Setup(); case :// Сохранение параметров data->SaveBin(); break; case : // Загрузка параметров return data->LoadBin(); // Реакция на нажатие клавиши case : // Приведение ExtParam к нужному типу key=()ExtParam; // Сравнение нажатой клавиши с клавишами уменьшения // и увеличения if(key->KeyCode==data->KeyPlus && key->Shift==data->ShiftsPlus) { v++; Ready=1; } else if(key->KeyCode==data->KeyMinus && key->Shift==data->ShiftsMinus) { v--; Ready=1; } break;
} return ; // Отмена макроопределений #undef v #undef Ready #undef Start #undef pStart } //=========================================


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