2009-07-13 2 views
1

ToolStripSplitButton을 파악하려고합니다. ToolStripSplitButton을 누를 때 사용자 정의 게이지를 표시하는 것이 목적입니다. 그러나 어떤 설정을 시도해도 버튼 아래에 회색 선이 표시됩니다.Winforms ToolStripSplitButton은 회색 선으로 표시되며, 마우스를 가리킬 때만 나타납니다.

ToolStrip 자체가 RenderMode.System으로 설정되고 도킹되지 않으며 ToolStripSplitButton이 유일한 구성 요소입니다.

사용자 지정 ToolStripRenderer 클래스를 도입하여 줄을 제거하지만, 컨트롤 아래에있는이 단일 성가신 어두운 회색 선을 제거하는 데 총 과잉처럼 보입니다.

나는이 구성 요소에 대한 gazillion 설정의 나머지 부분을 제공하지 않기 때문에 어둠 속에서 총소리가 들릴 수도 있지만, 누군가가이 컨트롤이 어떻게 작동하는지에 대한 통찰력을 제공하기를 기대하고있었습니다.


두 번째 질문은 ToolStripSplitButton의 동작에 관한 것입니다. 마우스를 가져 가기 전에 구성 요소가 표시하는 평면 및 경계선없는 모양을 피할 수있는 방법이 있습니까? 난 패널의 나머지 버튼과 함께 균일 한 모양을하려고 노력 중이 야, ToolStripSplitButton은 마우스 커서가 구성 요소 위에있을 때만 나타납니다. 어떤 도움을 크게 appreaciated됩니다

ToolStripSplitButton flawed

:

여기 스크린 샷입니다!

답변

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

}