Полный исходный текст на языке 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; } //=========================================