/// <summary> /// Initializes a new instance of the <see cref="Surface"/> class with the specified handler. /// </summary> /// <param name="events">The specified event handler.</param> /// <param name="scrollable">Whether this surface is scrollable or not.</param> /// <param name="width">The width of the scrollable surface.</param> /// <param name="height">The height of the scrollable surface.</param> public Surface(ISurfaceHandler events, bool scrollable = false, int width = -1, int height = -1) { SurfaceHandler surfaceEvents = new SurfaceHandler { Draw = (IntPtr surfaceHandler, IntPtr surface, ref Libui.uiAreaDrawParams args) => { Surface realSurface = Surfaces[surface]; DrawEventArgs a = new DrawEventArgs(new Context(args.Context), new RectangleD(args.ClipX, args.ClipY, args.ClipWidth, args.ClipHeight), new SizeD(args.AreaWidth, args.AreaHeight)); events.Draw(realSurface, ref a); }, MouseEvent = (IntPtr surfaceHandler, IntPtr surface, ref Libui.uiAreaMouseEvent args) => { Surface realSurface = Surfaces[surface]; MouseEventArgs a = new MouseEventArgs(new PointD(args.X, args.Y), new SizeD(args.AreaWidth, args.AreaHeight), args.Up, args.Down, args.Count, args.Modifiers, args.Held1To64); events.MouseEvent(realSurface, ref a); }, MouseCrossed = (IntPtr surfaceHandler, IntPtr surface, bool left) => { Surface realSurface = Surfaces[surface]; MouseCrossedEventArgs a = new MouseCrossedEventArgs(left); events.MouseCrossed(realSurface, a); }, DragBroken = (IntPtr surfaceHandler, IntPtr surface) => { Surface realSurface = Surfaces[surface]; events.DragBroken(realSurface); }, KeyEvent = (IntPtr surfaceHandler, IntPtr surface, ref Libui.uiAreaKeyEvent args) => { Surface realSurface = Surfaces[surface]; KeyEventArgs a = new KeyEventArgs(args.Key, args.ExtKey, args.Modifier, args.Modifiers, args.Up); return(events.KeyEvent(realSurface, ref a)); } }; EventHandler = new Libui.uiAreaHandler { DragBroken = Marshal.GetFunctionPointerForDelegate(surfaceEvents.DragBroken), Draw = Marshal.GetFunctionPointerForDelegate(surfaceEvents.Draw), KeyEvent = Marshal.GetFunctionPointerForDelegate(surfaceEvents.KeyEvent), MouseCrossed = Marshal.GetFunctionPointerForDelegate(surfaceEvents.MouseCrossed), MouseEvent = Marshal.GetFunctionPointerForDelegate(surfaceEvents.MouseEvent) }; IsScrollable = scrollable; if (scrollable) { Handle = Libui.uiNewScrollingArea(EventHandler, width, height); } else { Handle = Libui.uiNewArea(EventHandler); } Surfaces[Handle] = this; }
protected SurfaceBase(ISurfaceHandler events) { SurfaceHandler surfaceEvents = new SurfaceHandler { Draw = (IntPtr surfaceHandler, IntPtr surface, ref LibuiLibrary.uiAreaDrawParams args) => { SafeControlHandle surfaceHandle = new SafeControlHandle(surface); SurfaceBase realSurface = Surfaces[surfaceHandle]; DrawEventArgs a = args.ToDrawEventArgs(); events.Draw(realSurface, ref a); }, MouseEvent = (IntPtr surfaceHandler, IntPtr surface, ref LibuiLibrary.uiAreaMouseEvent args) => { SafeControlHandle surfaceHandle = new SafeControlHandle(surface); SurfaceBase realSurface = Surfaces[surfaceHandle]; MouseEventArgs a = args.ToMouseEventArgs(); events.MouseEvent(realSurface, ref a); }, MouseCrossed = (surfaceHandler, surface, left) => { SafeControlHandle surfaceHandle = new SafeControlHandle(surface); SurfaceBase realSurface = Surfaces[surfaceHandle]; MouseCrossedEventArgs a = new MouseCrossedEventArgs(left); events.MouseCrossed(realSurface, a); }, DragBroken = (surfaceHandler, surface) => { SafeControlHandle surfaceHandle = new SafeControlHandle(surface); SurfaceBase realSurface = Surfaces[surfaceHandle]; events.DragBroken(realSurface); }, KeyEvent = (IntPtr surfaceHandler, IntPtr surface, ref LibuiLibrary.uiAreaKeyEvent args) => { SafeControlHandle surfaceHandle = new SafeControlHandle(surface); SurfaceBase realSurface = Surfaces[surfaceHandle]; KeyEventArgs a = args.ToKeyEventArgs(); return(events.KeyEvent(realSurface, ref a)); } }; EventHandler = new LibuiLibrary.uiAreaHandler { DragBroken = Marshal.GetFunctionPointerForDelegate(surfaceEvents.DragBroken), Draw = Marshal.GetFunctionPointerForDelegate(surfaceEvents.Draw), KeyEvent = Marshal.GetFunctionPointerForDelegate(surfaceEvents.KeyEvent), MouseCrossed = Marshal.GetFunctionPointerForDelegate(surfaceEvents.MouseCrossed), MouseEvent = Marshal.GetFunctionPointerForDelegate(surfaceEvents.MouseEvent) }; }