Текущий раздел:

Описания RDS

Руководство программиста

Глава 2. Создание моделей блоков

§2.12. Реакция блоков на действия пользователя

§2.12.5. Реакция окон подсистем на мышь и клавиатуру

Полный исходный текст на языке C++ для библиотеки (DLL) с моделью подсистемы, которая при щелчке правой кнопкой мыши на рабочем поле переключает масштаб со 100% на 400% и обратно, а при нажатии курсорных клавиш одновременно с клавишей Shift перемещает свое окно в направлении нажатой клавиши на 5 точек экрана.

      // Реакция окон подсистем на мышь и клавиатуру
      #include <windows.h>
      #include <RdsDef.h>
      // Подготовка описаний сервисных функций
      #define RDS_SERV_FUNC_BODY GetInterfaceFunctions
      #include <RdsFunc.h>

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

      // Модель подсистемы с реакцией на мышь и клавиатуру
      extern "C" __declspec(dllexport)
        int RDSCALL SystemReaction(int CallMode,
                          RDS_PBLOCKDATA BlockData,
                          LPVOID ExtParam)
      { // Вспомогательные переменные
        RDS_EDITORPARAMETERS win;
        RDS_PMOUSEDATA mouse;
        RDS_PKEYDATA key;
        int x,y;

        switch(CallMode)
          { // Нажатие кнопки мыши в окне подсистемы
            case RDS_BFM_WINDOWMOUSEDOWN:
              // Приведение ExtParam к нужному типу
              mouse=(RDS_PMOUSEDATA)ExtParam;
              if(mouse->Button!=RDS_MRIGHTBUTTON)
                break; // Не правая кнопка - выходим
              // Вычисляем координаты щелчка в масштабе 100%
              x=mouse->x/mouse->DoubleZoom;
              y=mouse->y/mouse->DoubleZoom;
              // Установка нового масштаба подсистемы
              rdsSetZoomPercent(BlockData->Block,
                                mouse->IntZoom>100?100:400,x,y);
              break;

            // Нажатие клавиши в окне подсистемы
            case RDS_BFM_WINDOWKEYDOWN:
              // Приведение ExtParam к нужному типу
              key=(RDS_PKEYDATA)ExtParam;
              // Проверяем, нажата ли Shift
              if(key->Shift!=RDS_KSHIFT)
                break; // Не нажата - выходим
              // Получаем текущее положение окна подсистемы
              win.servSize=sizeof(win);
              if(!rdsGetEditorParameters(BlockData->Block,&win))
                break;
              // Если окно свернуто или развернуто, перемещать не надо
              if(win.WinMaximized || win.WinMinimized)
                break;
              //В зависимости от нажатой клавиши, вычисляем
              // перемещение окна (x,y)
              x=y=0;
              switch(key->KeyCode)
                { case VK_LEFT:  x=-5; break; // Влево
                  case VK_RIGHT: x=5;  break; // Вправо
                  case VK_UP:    y=-5; break; // Вверх
                  case VK_DOWN:  y=5;  break; // Вниз
                }
              // Если x или y не нулевые - перемещаем окно
              if(x||y)
                rdsSetSystemWindowBounds(BlockData->Block,FALSE,
                                         win.WinLeft+x,win.WinTop+y,
                                         win.WinWidth,win.WinHeight);
              break;
          }
        return RDS_BFR_DONE;
      }
      //=========================================