OberonCore https://forum.oberoncore.ru/ |
|
Работа с сообщениями скроллера мыши https://forum.oberoncore.ru/viewtopic.php?f=35&t=4072 |
Страница 1 из 1 |
Автор: | Иван Денисов [ Вторник, 04 Сентябрь, 2012 14:14 ] |
Заголовок сообщения: | Работа с сообщениями скроллера мыши |
Код: MODULE ObxWheel;
IMPORT Views, Controllers, Strings, Ports, Fonts, Properties; TYPE (* Создаем наследника абстрактоного объекта Views.View *) View = POINTER TO RECORD (Views.View) END; VAR posx, posy, number: INTEGER; xsize, ysize: INTEGER; font, comFont: Fonts.Font; v: View; (* Описываем обязательный метод отрисовки для объекта Views.View *) PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: INTEGER); VAR tmp: ARRAY 64 OF CHAR; BEGIN (* Располагаем в кадре строку *) f.DrawString(5 * f.dot, 15 * f.dot, Ports.black, "Try to weel with/without Ctl & Shift", comFont); (* Преобразуем переменнуюnumber из целочисленного типа в строку *) Strings.IntToString(number, tmp); (* Располагаем в кадре строку с результатом преобразования *) f.DrawString(posx * f.dot, posy * f.dot, Ports.blue, tmp, font) END Restore; (* Описываем необязательный метод поведения размеров окна Views.View *) PROCEDURE (v: View) HandlePropMsg (VAR msg: Properties.Message); (* Задаем размер по уплочанию *) CONST size = 150 * Ports.point; BEGIN (* Выполняем различные действия в зависимости от типа аругмента msg *) WITH msg: Properties.SizePref DO (* Если процедура примет сообщение об размерах окна и ширина окна неопределена, то устанавливаем по умолчанию *) IF msg.w = Views.undefined THEN msg.w := size; msg.h := size END ELSE END END HandlePropMsg; (* Описываем необязательный метод поведения Views.View в зависимости от ввода *) PROCEDURE (v: View) HandleCtrlMsg* (f: Views.Frame; VAR msg: Views.CtrlMessage; VAR focus: Views.View); VAR x, y: INTEGER; isDown: BOOLEAN; m: SET; BEGIN WITH msg: Controllers.WheelMsg DO (* Если пользователь крутил колесо мыши, считываем информацию о вводе *) f.Input(x, y, m, isDown); IF Controllers.modify IN m THEN (* Если нажат Ctrl *) IF msg.op = Controllers.incLine THEN INC(posx, 3) ELSE DEC(posx, 3) END ELSIF Controllers.extend IN m THEN (* Если нажат Shift *) IF msg.op = Controllers.incLine THEN INC(posy, 3) ELSE DEC(posy, 3) END ELSE (* Если не нажата ни Ctrl ни Shift *) IF msg.op = Controllers.incLine THEN INC(number) ELSE DEC(number) END; END; (* Чтобы сообщение не обрабатывалось другими отображениями, ставим флаг *) msg.done := TRUE; (* Обновляем отображение *) Views.Update(v, Views.keepFrames) ELSE END END HandleCtrlMsg; PROCEDURE Do*; VAR BEGIN (* Создаем в оперативной памяти новый объект *) NEW(v); (* Открываем отображение в новом окне *) Views.OpenAux(v, "Mouse Wheel Demo") END Do; BEGIN (* Задаем начальные значения переменных *) number := 1; posx := 50; posy := 70; comFont := Fonts.dir.This("Arial", 9 * Ports.point, {}, Fonts.normal); font := Fonts.dir.This("Arial", 20 * Ports.point, {}, Fonts.normal); END ObxWheel. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |