c# - 如何将图像放在 ToolStripMenuItem(或类似控件)的文本旁边?

标签 c# .net winforms

我知道可以将图像添加到 ToolStripMenuItem,如下图中的“关闭所有文档”项:

Menu with some ToolStripMenuItems

但是,我想实现的是这样的:

enter image description here

也就是将图片放在item文本的旁边,但不与check space重叠。 我搜索了一下,但找不到可以执行此操作的 Winforms 控件。 你能指点我吗?还是我必须自己实现? 谢谢。

编辑:感谢大家的回答!周末后我会接受一个。

最佳答案

你必须使用一些自定义绘画。有一些方法可以实现这一点,但我想介绍一下使用一些自定义 ToolStripRenderer。以下只是一个demo代码,大家可以自行完善。为方便起见,我将每个 inner Image 保存在相应项目的 Tag 中:

public class CustomRenderer : ToolStripProfessionalRenderer
{
    int innerImagePadding = 2;
    protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e) {
        Image img = e.Item.Tag as Image;
        if(img == null) base.OnRenderItemText(e);
        else {
          e.Graphics.DrawImage(img, e.Item.ContentRectangle.Left + e.Item.Bounds.Height + innerImagePadding,
                               e.Item.ContentRectangle.Top + innerImagePadding, 
                               Math.Max(1, e.Item.ContentRectangle.Height - innerImagePadding*2), 
                               Math.Max(1, e.Item.ContentRectangle.Height - innerImagePadding*2));              
          Rectangle textRect = new Rectangle(e.Item.ContentRectangle.Left + e.Item.Bounds.Height*2, 
                               e.Item.ContentRectangle.Top +1, 
                               e.TextRectangle.Width, 
                               e.TextRectangle.Height);
          e.Graphics.DrawString(e.Text, e.TextFont, new SolidBrush(e.TextColor), textRect);
       }
    }
}

//Usage
ContextMenuStrip cm = new ContextMenuStrip();
cm.Items.Add(new ToolStripMenuItem("Clear all", myImage) {Tag = myImage});
cm.Items.Add(new ToolStripMenuItem("Remove all", myImage){Tag = myImage});
this.ContextMenuStrip = cm; //set the ContextMenuStrip for the form
//set the custom Renderer
cm.Renderer = new CustomRenderer();

enter image description here

关于c# - 如何将图像放在 ToolStripMenuItem(或类似控件)的文本旁边?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19861214/

相关文章:

.net - App.Config 中的重复键不会引发异常

c# - 获取表格的矩形

c# - 冗余设置控件属性有任何开销吗?

c# - 如何允许在 DataGridView 上插入?

c# - 在 IIS 上发布时出现 EmguCV 异常

c# - 对 Windows 窗体控件进行线程安全调用

.net - 为什么 InitializeComponent 是公开的

c# - 是否可以像数组一样定义列表?

c# - 添加服务引用和添加 Web 引用?

c# - WPF:richtextbox 选项卡问题