/// <summary> /// 初期化 /// </summary> /// <param name="name">ボタンの名前. (これが null の場合,”button <number of boutton>” という名前になります)</param> /// <param name="callback">ボタン状態が変更される度に呼び出されるデりゲート</param> /// <param name="userdata">コールバック関数に渡されるオブジェクト</param> /// <param name="button_type">ボタンの種類</param> /// <param name="initial_button_state">ボタンのデフォルトの状態.チェックボックスとラジオボックスの場合,これは 0 または 1 になります.</param> #else /// <summary> /// Constructor /// </summary> /// <param name="name">Name of the button ( if null, the name will be “button <number of boutton>”)</param> /// <param name="callback">Pointer to the function to be called every time the button changed its state.</param> /// <param name="userdata">object passed to the callback function. </param> /// <param name="button_type">button type</param> /// <param name="initial_button_state">Default state of the button. Use for checkbox and radiobox, its value could be 0 or 1. </param> #endif public CvButton(string name, CvButtonCallback callback, object userdata, ButtonType button_type, int initial_button_state) { this.name = name; 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; IntPtr callbackPtr; if (callback != null) { // コールバックdelegateを、userdataをobjectとするように変換 callbackNative = delegate(int state, IntPtr ud) { if (ud == IntPtr.Zero) { callback(state, null); } else { GCHandle gch = GCHandle.FromIntPtr(ud); callback(state, gch.Target); } }; // コールバックdelegateをポインタに変換 gchCallback = GCHandle.Alloc(callback); gchCallbackNative = GCHandle.Alloc(callbackNative); callbackPtr = Marshal.GetFunctionPointerForDelegate(callbackNative); } else { callbackNative = null; callbackPtr = IntPtr.Zero; } result = NativeMethods.cvCreateButton(name, callbackPtr, userdataPtr, button_type, initial_button_state); if (result == 0) { throw new OpenCvSharpException("Failed to create CvButton."); } instances.Add(this); }
/// <summary> /// 初期化 /// </summary> /// <param name="name">ボタンの名前. (これが null の場合,”button <number of boutton>” という名前になります)</param> /// <param name="callback">ボタン状態が変更される度に呼び出されるデりゲート</param> /// <param name="userdata">コールバック関数に渡されるオブジェクト</param> /// <param name="button_type">ボタンの種類</param> /// <param name="initial_button_state">ボタンのデフォルトの状態.チェックボックスとラジオボックスの場合,これは 0 または 1 になります.</param> #else /// <summary> /// Constructor /// </summary> /// <param name="name">Name of the button ( if null, the name will be “button <number of boutton>”)</param> /// <param name="callback">Pointer to the function to be called every time the button changed its state.</param> /// <param name="userdata">object passed to the callback function. </param> /// <param name="button_type">button type</param> /// <param name="initial_button_state">Default state of the button. Use for checkbox and radiobox, its value could be 0 or 1. </param> #endif public CvButton(string name, CvButtonCallback callback, object userdata, ButtonType button_type, int initial_button_state) { _name = name; _userdata = userdata; // userdataをIntPtrに変換 IntPtr userdataPtr; if (userdata != null) { _gchUserdata = GCHandle.Alloc(_userdata); userdataPtr = GCHandle.ToIntPtr(_gchUserdata); } else { userdataPtr = IntPtr.Zero; } _callback = callback; IntPtr callbackPtr; if (_callback != null) { // コールバックdelegateを、userdataをobjectとするように変換 _callbackNative = delegate(int state, IntPtr ud) { if (ud == IntPtr.Zero) { _callback(state, null); } else { GCHandle gch = GCHandle.FromIntPtr(ud); _callback(state, gch.Target); } }; // コールバックdelegateをポインタに変換 _gchCallback = GCHandle.Alloc(_callback); _gchCallbackNative = GCHandle.Alloc(_callbackNative); callbackPtr = Marshal.GetFunctionPointerForDelegate(_callbackNative); } else { _callbackNative = null; callbackPtr = IntPtr.Zero; } _result = CvInvoke.cvCreateButton(name, callbackPtr, userdataPtr, button_type, initial_button_state); if (_result == 0) throw new OpenCvSharpException("Failed to create CvButton."); _instances.Add(this); }