/// <summary> /// 初期化 /// </summary> /// <param name="name">トラックバーの名前</param> /// <param name="window">トラックバーの親ウィンドウ名</param> /// <param name="value">スライダの初期位置</param> /// <param name="max">スライダの最大値.最小値は常に 0.</param> /// <param name="callback">スライダの位置が変更されるたびに呼び出されるデリゲート</param> /// <param name="userdata"></param> #else /// <summary> /// Constructor /// </summary> /// <param name="name">Trackbar name</param> /// <param name="window">Window name</param> /// <param name="value">Initial slider position</param> /// <param name="max">The upper limit of the range this trackbar is working with. </param> /// <param name="callback">Callback handler</param> /// <param name="userdata"></param> #endif public CvTrackbar(string name, string window, int value, int max, CvTrackbarCallback2 callback, object?userdata) { if (string.IsNullOrEmpty(name)) { throw new ArgumentNullException(nameof(name)); } if (string.IsNullOrEmpty(window)) { throw new ArgumentNullException(nameof(window)); } this.name = name; this.window = window; this.value = value; this.max = max; this.callback = callback ?? throw new ArgumentNullException(nameof(callback)); this.userdata = userdata; // userdataをIntPtrに変換 IntPtr userdataPtr; if (userdata != null) { gchUserdata = GCHandle.Alloc(userdata); userdataPtr = GCHandle.ToIntPtr(gchUserdata); } else { userdataPtr = IntPtr.Zero; } this.callback = callback; // コールバックdelegateを、userdataをobjectとするように変換 callbackNative = (pos, ud) => { if (ud == IntPtr.Zero) { callback(pos, null); } else { var gch = GCHandle.FromIntPtr(ud); callback(pos, gch.Target); } }; // コールバックdelegateをポインタに変換 gchCallback = GCHandle.Alloc(callback); gchCallbackNative = GCHandle.Alloc(callbackNative); var callbackPtr = Marshal.GetFunctionPointerForDelegate(callbackNative); //gchValue = GCHandle.Alloc(value, GCHandleType.Pinned); result = NativeMethods.highgui_createTrackbar(name, window, ref this.value, max, callbackPtr, userdataPtr); if (result == 0) { throw new OpenCvSharpException("Failed to create CvTrackbar."); } }
/// <summary> /// 初期化 /// </summary> /// <param name="name">トラックバーの名前</param> /// <param name="window">トラックバーの親ウィンドウ名</param> /// <param name="value">スライダの初期位置</param> /// <param name="max">スライダの最大値.最小値は常に 0.</param> /// <param name="callback">スライダの位置が変更されるたびに呼び出されるデリゲート</param> #else /// <summary> /// Constructor /// </summary> /// <param name="name">Trackbar name</param> /// <param name="window">Window name</param> /// <param name="value">Initial slider position</param> /// <param name="max">The upper limit of the range this trackbar is working with. </param> /// <param name="callback">Callback handler</param> #endif public CvTrackbar(string name, string window, int value, int max, CvTrackbarCallback callback) { if (string.IsNullOrEmpty(name)) { throw new ArgumentNullException(nameof(name)); } if (string.IsNullOrEmpty(window)) { throw new ArgumentNullException(nameof(window)); } this.name = name; this.window = window; this.value = value; this.max = max; this.callback = callback ?? throw new ArgumentNullException(nameof(callback)); // userdata wrapper callbackNative = (pos, ud) => callback(pos); //gchValue = GCHandle.Alloc(value, GCHandleType.Pinned); gchCallback = GCHandle.Alloc(callback); gchCallbackNative = GCHandle.Alloc(callbackNative); var callbackPtr = Marshal.GetFunctionPointerForDelegate(callbackNative); NativeMethods.HandleException( NativeMethods.highgui_createTrackbar(name, window, ref this.value, max, callbackPtr, IntPtr.Zero, out result)); if (result == 0) { throw new OpenCvSharpException("Failed to create CvTrackbar."); } }
/// <summary> /// 初期化 /// </summary> /// <param name="name">トラックバーの名前</param> /// <param name="window">トラックバーの親ウィンドウ名</param> /// <param name="value">スライダの初期位置</param> /// <param name="max">スライダの最大値.最小値は常に 0.</param> /// <param name="callback">スライダの位置が変更されるたびに呼び出されるデリゲート</param> /// <param name="userdata"></param> #else /// <summary> /// Constructor /// </summary> /// <param name="name">Trackbar name</param> /// <param name="window">Window name</param> /// <param name="value">Initial slider position</param> /// <param name="max">The upper limit of the range this trackbar is working with. </param> /// <param name="callback">Callback handler</param> /// <param name="userdata"></param> #endif public CvTrackbar(string name, string window, int value, int max, CvTrackbarCallback2 callback, object userdata) { if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name)); if (string.IsNullOrEmpty(window)) throw new ArgumentNullException(nameof(window)); if (callback == null) throw new ArgumentNullException(nameof(callback)); this.name = name; this.window = window; this.value = value; this.max = max; this.callback = callback; this.userdata = userdata; // userdataをIntPtrに変換 IntPtr userdataPtr; if (userdata != null) { gchUserdata = GCHandle.Alloc(userdata); userdataPtr = GCHandle.ToIntPtr(gchUserdata); } else { userdataPtr = IntPtr.Zero; } this.callback = callback; // コールバックdelegateを、userdataをobjectとするように変換 callbackNative = delegate(int pos, IntPtr ud) { if (ud == IntPtr.Zero) { callback(pos, null); } else { GCHandle gch = GCHandle.FromIntPtr(ud); callback(pos, gch.Target); } }; // コールバックdelegateをポインタに変換 gchCallback = GCHandle.Alloc(callback); gchCallbackNative = GCHandle.Alloc(callbackNative); IntPtr callbackPtr = Marshal.GetFunctionPointerForDelegate(callbackNative); gchValue = GCHandle.Alloc(value, GCHandleType.Pinned); result = NativeMethods.highgui_createTrackbar(name, window, ref this.value, max, callbackPtr, userdataPtr); if (result == 0) throw new OpenCvSharpException("Failed to create CvTrackbar."); }
/// <summary> /// 初期化 /// </summary> /// <param name="name">トラックバーの名前</param> /// <param name="window">トラックバーの親ウィンドウ名</param> /// <param name="value">スライダの初期位置</param> /// <param name="max">スライダの最大値.最小値は常に 0.</param> /// <param name="callback">スライダの位置が変更されるたびに呼び出されるデリゲート</param> /// <param name="userdata"></param> #else /// <summary> /// Constructor /// </summary> /// <param name="name">Trackbar name</param> /// <param name="window">Window name</param> /// <param name="value">Initial slider position</param> /// <param name="max">The upper limit of the range this trackbar is working with. </param> /// <param name="callback">Callback handler</param> /// <param name="userdata"></param> #endif public CvTrackbar(string name, string window, int value, int max, CvTrackbarCallback2 callback, object userdata) { if (string.IsNullOrEmpty(name)) throw new ArgumentNullException("name"); if (string.IsNullOrEmpty(window)) throw new ArgumentNullException("window"); if (callback == null) throw new ArgumentNullException("callback"); _name = name; _window = window; _value = value; _max = max; _callback = callback; _userdata = userdata; // userdataをIntPtrに変換 IntPtr userdataPtr; if (userdata != null) { _gchUserdata = GCHandle.Alloc(_userdata); userdataPtr = GCHandle.ToIntPtr(_gchUserdata); } else { userdataPtr = IntPtr.Zero; } _callback = callback; // コールバックdelegateを、userdataをobjectとするように変換 _callbackNative = delegate(int pos, IntPtr ud) { if (ud == IntPtr.Zero) { callback(pos, null); } else { GCHandle gch = GCHandle.FromIntPtr(ud); callback(pos, gch.Target); } }; // コールバックdelegateをポインタに変換 _gchCallback = GCHandle.Alloc(callback); _gchCallbackNative = GCHandle.Alloc(_callbackNative); IntPtr callbackPtr = Marshal.GetFunctionPointerForDelegate(_callbackNative); _gchValue = GCHandle.Alloc(value, GCHandleType.Pinned); #if DEBUG int result = CvInvoke.cvCreateTrackbar2(name, window, ref value, max, _callbackNative, userdataPtr); #else _result = CvInvoke.cvCreateTrackbar2(name, window, ref value, max, callbackPtr, userdataPtr); #endif if (_result == 0) throw new OpenCvSharpException("Failed to create CvTrackbar."); }