2015-09-25 33 views
2

有沒有辦法使用Windows 10風格的Visual Studio和Forms創建ContextMenuStrip。我知道,它的渲染器可以以有樣子的Windows Vista,7和8來改變這就是我做了什麼:Windows 10風格的上下文菜單條

enter image description here

但我也想使它看起來像這樣視窗10:

enter image description here

有沒有辦法使用Windows Forms來做到這一點,還是應該在一些特殊的方式來完成,使用地鐵類等?

+1

如果你想要它完全相同,那麼你需要使用本地菜單組件包裝。右鍵單擊工具箱>選擇項目> .NET Framework組件選項卡>勾選「ContextMenu」。 –

+0

感謝您的評論!我想完全使用ContextMenuStrip,因爲它有一些功能,我想在我的應用程序中實現。我相信,仍然可以更改ContextMenuStrip的Renderer,以改變其視覺風格。 –

+0

我正在尋找相同的東西,但是使用本機Win32 HMENU而不是WinForms ContextMenu(爲坐在系統托盤中的輕量級C++應用程序執行此操作)。任何人都有線索? –

回答

2

您可以實施您的自定義Renderer並覆蓋OnRenderArrowOnRenderItemCheck並將您的自定義ColorTable傳遞給它。然後將其設置爲ContextMenuRenderer

enter image description here

代碼ColorTable:

public class MyColorTable : ProfessionalColorTable 
{ 
    public override Color MenuItemBorder 
    { 
     get { return Color.WhiteSmoke; } 
    } 
    public override Color MenuItemSelected 
    { 
     get { return Color.WhiteSmoke; } 
    } 
    public override Color ToolStripDropDownBackground 
    { 
     get { return Color.White; } 
    } 
    public override Color ImageMarginGradientBegin 
    { 
     get { return Color.White; } 
    } 
    public override Color ImageMarginGradientMiddle 
    { 
     get { return Color.White; } 
    } 
    public override Color ImageMarginGradientEnd 
    { 
     get { return Color.White; } 
    } 
} 

代碼渲染:

public class MyRenderer : ToolStripProfessionalRenderer 
{ 
    public MyRenderer() 
     : base(new MyColorTable()) 
    { 
    } 
    protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e) 
    { 
     e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; 
     var r = new Rectangle(e.ArrowRectangle.Location, e.ArrowRectangle.Size); 
     r.Inflate(-2, -6); 
     e.Graphics.DrawLines(Pens.Black, new Point[]{ 
     new Point(r.Left, r.Top), 
     new Point(r.Right, r.Top + r.Height /2), 
     new Point(r.Left, r.Top+ r.Height)}); 
    } 

    protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e) 
    { 
     e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; 
     var r = new Rectangle(e.ImageRectangle.Location, e.ImageRectangle.Size); 
     r.Inflate(-4, -6); 
     e.Graphics.DrawLines(Pens.Black, new Point[]{ 
     new Point(r.Left, r.Bottom - r.Height /2), 
     new Point(r.Left + r.Width /3, r.Bottom), 
     new Point(r.Right, r.Top)}); 
    } 
} 

代碼窗體的Load:

private void Form_Load(object sender, EventArgs e) 
{ 
    this.contextMenuStrip1.Renderer = new MyRenderer(); 
} 
+0

感謝您的評論!爲我完美工作! –

+0

歡迎您:) –