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 ) );
}