2009-07-13 2 views
1

Я пытаюсь выяснить ToolStripSplitButton. Цель состоит в том, чтобы отображать указатель usercontrol при нажатии кнопки ToolStripSplitButton. Однако, независимо от того, какие настройки я пытаюсь сделать, под кнопкой отображается серая линия.Winforms ToolStripSplitButton отображает с серой линией под ним и только поднимается, когда мышь нависает над ним

Сам инструмент ToolStrip установлен в RenderMode.System, не закреплен, а ToolStripSplitButton является единственным компонентом в нем.

Я понимаю, что это может быть полный выстрел в темноте, так как я не предоставляю остальную часть настроек gazillion для этих компонентов, но я надеялся, что кто-то сможет понять, почему этот контроль ведет себя так, как он делает.

Мой второй вопрос касается поведения ToolStripSplitButton. Есть ли способ избежать плоского и безграничного взгляда, который компонент отображает, прежде чем мышь нависает над ним? Я пытаюсь придать ей единый вид вместе с остальными кнопками на панели, и ToolStripSplitButton появляется только при поднятии курсора мыши над компонентом.

Вот скриншот:

ToolStripSplitButton flawed

Любая помощь очень appreaciated!

ответ

1

Для всех, кого это интересует, я все-таки создал собственный класс ToolStripRenderer. Здесь мне пришлось переопределить несколько методов, чтобы получить желаемый результат, и результат получился довольно приятным. Чтобы нарисовать контур кнопки, я просто использовал ControlPaint, и для выпадающего вклада, подобранного на вкладке, я нарисовал некоторые строки с цветом системы ControlDarkDark. Чтобы не попасть в подробности, есть несколько учебников, описывающих это уже. Теперь кажется странным, что для того, чтобы получить поведение, подобное кнопкам, из ToolStripDropDownButton нужно сделать сам чертеж, но я не исключаю, что настройка могла бы столкнуться с чем-то другим.

Я могу опубликовать код, если кому-то это интересно.

2
/// <summary> 
/// This class provides custom rendering code for the ToolStrip and ToolStripDropDownButton because the standard windows 
/// rendering gave it a very flat look. 
/// </summary> 
public class CustomToolStripRenderer : ToolStripRenderer { 
    ToolStripDropDownButton toolStripDDButton; 

    public CustomToolStripRenderer(ToolStripDropDownButton toolStripDropDownButton) : base() { 
     toolStripDDButton = toolStripDropDownButton; 
    } 

    //protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs tsirea) { 
    // // Check if the item is selected or hovered over. 
    // if (tsirea.Item.Selected || tsirea.Item.Pressed) { 
    //  LinearGradientBrush brush = new LinearGradientBrush(tsirea.Item.Bounds, Color.DarkBlue, Color.DarkGreen, 90); 
    //  tsirea.Graphics.FillRectangle(brush, 0, 0, tsirea.Item.Width, tsirea.Item.Height); 
    // } 
    //} 

    protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs tsrea) { 
     // This event occurs before the OnRenderDropDownButtonBackground event... 

     if (toolStripDDButton.Pressed) { 
      base.OnRenderToolStripBackground(tsrea); 
     } 
     else if (toolStripDDButton.Selected) { 
      ControlPaint.DrawButton(tsrea.Graphics, tsrea.AffectedBounds, ButtonState.Normal); 
     } 
     else { 
      ControlPaint.DrawButton(tsrea.Graphics, tsrea.AffectedBounds, ButtonState.Normal); 
     } 
    } 

    //protected override void OnRenderDropDownButtonBackground(ToolStripItemRenderEventArgs tsirea) { 
    // // Happens every time the button is hovered over as well, and upon mouseleave 

    // //ControlPaint.DrawButton(tsirea.Graphics, tsirea.Item.ContentRectangle, ButtonState.Normal); 
    // base.OnRenderDropDownButtonBackground(tsirea); 
    //} 

    protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs tsrea) { 
     //This event occurs after the OnRenderDropDownButtonBackground event... 
     //Thus it will paint over whatever is already painted in the OnRenderDropDownButtonBackground event. 

     //Debug.Println("OnRenderToolStripBorder"); 
     if (toolStripDDButton.Pressed) { 
      // Draw the top and left borders of the component so that it looks like a tab page: 
      tsrea.Graphics.DrawLine(SystemPens.ControlDarkDark, tsrea.AffectedBounds.Left, tsrea.AffectedBounds.Top, tsrea.AffectedBounds.Left, tsrea.AffectedBounds.Bottom); 
      tsrea.Graphics.DrawLine(SystemPens.ControlDarkDark, tsrea.AffectedBounds.Left, tsrea.AffectedBounds.Top, tsrea.AffectedBounds.Right, tsrea.AffectedBounds.Top); 
     } 
     base.OnRenderToolStripBorder(tsrea); 
    } 

}