예제 #1
0
        /// <summary>
        /// 初期化
        /// </summary>
        /// <param name="name">ボタンの名前. (これが null の場合,”button &lt;number of boutton&gt;” という名前になります)</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 &lt;number of boutton&gt;”)</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);
        }
예제 #2
0
        /// <summary>
        /// 初期化
        /// </summary>
        /// <param name="name">ボタンの名前. (これが null の場合,”button &lt;number of boutton&gt;” という名前になります)</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 &lt;number of boutton&gt;”)</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);
        }