cadencii.windows.forms.RebarBand.Show C# (CSharp) Method

Show() public method

public Show ( Control control, Rectangle chevron_rect ) : void
control System.Windows.Forms.Control
chevron_rect System.Drawing.Rectangle
return void
        public void Show( Control control, Rectangle chevron_rect ) {
            if ( !(control is Rebar) ) return;
            Rebar parent = (Rebar)control;
            // Bandの外形を調べる
            RECT rc_band = new RECT();
            if ( win32.SendMessage( parent.RebarHwnd, win32.RB_GETRECT, this.BandIndex, ref rc_band ) == 0 ) return;
            // chevronの分の幅を引く
            rc_band.right -= chevron_rect.Width;
            if( this._child == null ) return;
            //TODO: このへんmanagedな処理に書き換える
            // ツールバーのボタンの数を調べる
            int num_buttons = (int)win32.SendMessage( this._child.Handle, (int)win32.TB_BUTTONCOUNT, 0, IntPtr.Zero );
            if ( num_buttons <= 0 ) return;
            // ツールバーの各ボタンについて処理
            int hidden_start = num_buttons;
            // ツールバー
            if ( !(this._child is ToolBar) ) return;
            ToolBar toolbar = (ToolBar)this._child;
            for ( int i = 0; i < num_buttons; i++ ) {
                // ボタンの外形を調べる
                RECT rc_button = new RECT();
                if ( win32.SendMessage( this._child.Handle, win32.TB_GETITEMRECT, i, ref rc_button ) == 0 ) return;
                rc_button.left += rc_band.left;
                rc_button.right += rc_band.left;
                rc_button.top += rc_band.top;
                rc_button.bottom += rc_band.top;
                RECT rc_intersect = new RECT();
                win32.IntersectRect( ref rc_intersect, ref rc_button, ref rc_band );
                if ( win32.EqualRect( ref rc_intersect, ref rc_button ) ) {
                    // ボタンは隠れていないので続ける
                    continue;
                }
                hidden_start = i;
                break;
            }
            // 隠れているボタンが一つもない場合は何もしない
            if ( hidden_start >= num_buttons ) return;
            // pop-upメニューを作成する
            ContextMenu popup = new ContextMenu();
            for ( int i = hidden_start; i < num_buttons; i++ ) {
                uint id = (uint)i;
                // ボタンの情報を調べながら,ポップアップに追加
                ToolBarButton button = toolbar.Buttons[i];
                if ( button.Style == ToolBarButtonStyle.PushButton ||
                     button.Style == ToolBarButtonStyle.ToggleButton ) {
                    MenuItem menu = new MenuItem();
                    menu.Text = button.Text;
                    menu.Tag = button;
                    menu.DrawItem += drawChevronMenuItem;
                    menu.MeasureItem += measureChevronMenuItem;
                    menu.OwnerDraw = true;
                    menu.Click += handleChevronMenuItemClick;
                    popup.MenuItems.Add( menu );
                } else if ( button.Style == ToolBarButtonStyle.DropDownButton ) {
                    if ( button.DropDownMenu != null && button.DropDownMenu.MenuItems != null ) {
                        MenuItem menu = new MenuItem();
                        cloneMenuItemRecursive( menu.MenuItems, button.DropDownMenu.MenuItems );
                        menu.Text = button.Text;
                        popup.MenuItems.Add( menu );
                    }
                }
            }
            // ポップアップメニューを表示
            popup.Show( control, new Point( chevron_rect.Left, chevron_rect.Bottom ) );
        }