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

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

  // Реакция окон подсистем на мышь и клавиатуру
  #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  SystemReaction(int CallMode,
                       BlockData,
                       ExtParam)
  { // Вспомогательные переменные
     win;
     mouse;
     key;
    int x,y;

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

        // Нажатие клавиши в окне подсистемы
        case :
          // Приведение ExtParam к нужному типу
          key=()ExtParam;
          // Проверяем, нажата ли Shift
          if(key->Shift!=)
            break; // Не нажата - выходим
          // Получаем текущее положение окна подсистемы
          win.servSize=sizeof(win);
          if(!(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)
            (BlockData->Block,FALSE,
                                     win.WinLeft+x,win.WinTop+y,
                                     win.WinWidth,win.WinHeight);
          break;
      }
    return ;
  }
  //=========================================


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