singapur22 14 Опубликовано 13 Июля 2011 (изменено) Описание: Менеджер контроля за положением курсора мыши на экране. (экспериментальный, как вариант)Автор: Singapur22Принцип: "1 из 4'ёх >> компресс >> 1 из 4'ёх >> компресс >> и т.д." 1. Создаём скриптовый файл, например: _mouse_pos.script 2. Вписываем в тело файла, код класса: local const_wins = {"winLT", "winRT", "winLD", "winRD"} --/summary/>> Event Rece function StaticRece(args) args[1].rec = args[2] end local win_id = 0 class "mouse_position" (CUIStatic) function mouse_position:__init(x, y, width, height, scriptWnd) super() win_id = win_id + 1 self.id = win_id self.X = x self.Y = y self.widthEl = width / 2 --ширина элемента зоны контроля, в режиме ожидания self.heightEl = height / 2 --высота элемента зоны контроля, в режиме ожидания self.rec = nil --постоянная элемента, на котором произашло событие захвата курсора self.get = false --ключ запуска, определения позиции курсора self.method = nil --метод (функция), в которую требуется передать полученные координаты self.owner = nil --объект, которому требуется передать полученные координаты self:SetWndRect(x, y, width, height) --устанавливаем общий размер зоны контроля (относительно её и будут выдаваться координаты) scriptWnd:Register(self, "event_winZC"..self.id) scriptWnd:AddCallback("event_winZC"..self.id, ui_events.STATIC_FOCUS_LOST, self.ZoneControllLost, self) --//делим зону контроля на 4 части self.winLT = CUIStatic() --элемент левого, верхнего угла self.winRT = CUIStatic() --элемент правого, верхнего угла self.winLD = CUIStatic() --элемент левого, нижнего угла self.winRD = CUIStatic() --элемент правого, нижнего угла self.winLT.X, self.winLT.Y = x, y self.winRT.X, self.winRT.Y = x + self.widthEl, y self.winLD.X, self.winLD.Y = x, y + self.heightEl self.winRD.X, self.winRD.Y = x + self.widthEl, y + self.heightEl for _, v in ipairs(const_wins) do self[v]:Init(self[v].X, self[v].Y, self.widthEl, self.heightEl) self[v]:SetAutoDelete(true) local reg_name = "event_"..v..self.id scriptWnd:Register(self[v], reg_name) scriptWnd:AddCallback(reg_name, ui_events.STATIC_FOCUS_RECEIVED, StaticRece, {self, v}) self:AttachChild(self[v]) end end --/summary/>> Event Lost Zone_Controll function mouse_position:ZoneControllLost() self.rec = nil if self.get then self.get = false self:recompress_zone() end end --/summary/>> Method Compress function mouse_position:compress_zone(win) if not win then return end local x, y = win.X, win.Y local width = win:GetWidth() / 2 local height = win:GetHeight() / 2 if win:GetWidth() < 5 then if self.method then self.method(self.owner, x + width, y + height) self.get, self.method, self.owner = false self:recompress_zone() end return end self:SetWndRectElements(x, y, width, height) end --/summary/>> Method Recompress function mouse_position:recompress_zone() self:SetWndRectElements(self.X, self.Y, self.widthEl, self.heightEl) end --/summary/>> Method SetWndRect function mouse_position:SetWndRectElements(x, y, width, height) self.winLT.X = x self.winLT.Y = y self.winLT:SetWndRect(self.winLT.X, self.winLT.Y, width, height) self.winRT.X = x + width self.winRT.Y = y self.winRT:SetWndRect(self.winRT.X, self.winRT.Y, width, height) self.winLD.X = x self.winLD.Y = y + height self.winLD:SetWndRect(self.winLD.X, self.winLD.Y, width, height) self.winRD.X = x + width self.winRD.Y = y + height self.winRD:SetWndRect(self.winRD.X, self.winRD.Y, width, height) end --/summary/>> Update function mouse_position:Update() if self.get then if not self.rec then self.get = false return end get_console():execute("mouse_pos="..tostring(self.rec)) self:compress_zone(self[self.rec]) end end --/summary/>> Method Start Get Position Cursor function mouse_position:GetPos(method, owner) self.get, self.method, self.owner = true, method, owner end Конструктор, инициализатор менеджера позиции курсора: self.mp = _mouse_pos.mouse_position(x, y, width, height, scriptWnd) Где:x = позиция начала координат, зоны контроля, по Xy = позиция начала координат, зоны контроля, по Ywidth = ширина зоны контроляheight = высота зоны контроляscriptWnd = объект класса CUIScriptWnd, относительно которого была произведена инициализация менеджера позиции курсора. Апдейт схемы контроля: self.mp:Update() Апдейт необходимо производить из виртуальной функции Update(), объекта класса CUIScriptWnd, относительно которого была произведена инициализация менеджера позиции курсора. Метод определения координат, относительно зоны контроля: self.mp:GetPos(method, owner) Где:method = метод (функция), в которую требуется передать полученные координаты, после завершения просчётаowner = объект, в котором нужно обратиться к указанному методу. если method является простой функцией (не методом), то owner передаётся в неё как первый аргумент. Приаттачиваем менеджер к объекту контроля: self:AttachChild(self.mp) Изменено 15 Декабря 2017 пользователем Murarius 1 Опаа-а!!! Ливер вылез! Поделиться этим сообщением Ссылка на сообщение