protected AreaBase(IAreaHandler handler) { var areaHandlerInternal = new AreaHandler { DragBroken = (areaHandler, area) => { var realArea = Areas[area]; handler.DragBroken(realArea); }, Draw = (IntPtr areaHandler, IntPtr area, ref AreaDrawParamsInternal param) => { var realArea = Areas[area]; var p = (AreaDrawParams)param; handler.Draw(realArea, ref p); }, KeyEvent = (IntPtr areaHandler, IntPtr area, ref AreaKeyEvent keyEvent) => { var realArea = Areas[area]; return(handler.KeyEvent(realArea, ref keyEvent)); }, MouseCrossed = (areaHandler, area, left) => { var realArea = Areas[area]; handler.MouseCrossed(realArea, left); }, MouseEvent = (IntPtr areaHandler, IntPtr area, ref AreaMouseEvent mouseEvent) => { var realArea = Areas[area]; handler.MouseEvent(realArea, ref mouseEvent); } }; AreaHandlerInternal = new AreaHandlerInternal { DragBroken = Marshal.GetFunctionPointerForDelegate(areaHandlerInternal.DragBroken), Draw = Marshal.GetFunctionPointerForDelegate(areaHandlerInternal.Draw), KeyEvent = Marshal.GetFunctionPointerForDelegate(areaHandlerInternal.KeyEvent), MouseCrossed = Marshal.GetFunctionPointerForDelegate(areaHandlerInternal.MouseCrossed), MouseEvent = Marshal.GetFunctionPointerForDelegate(areaHandlerInternal.MouseEvent) };; }