C# 带有图标和复选框的ToolStripControlHost。所选项目的亮度有多高?在图标字段中添加图标?

C# 带有图标和复选框的ToolStripControlHost。所选项目的亮度有多高?在图标字段中添加图标?,c#,winforms,.net-4.0,custom-controls,toolstripitem,C#,Winforms,.net 4.0,Custom Controls,Toolstripitem,我想创建自定义ToolStripItem,其中包含复选框和图标。 我想通过创建带有两个picturebox和标签的自定义控件来实现这一点。 左pictureboxif for icon和右作为特殊的复选框向收藏夹添加位置 我将该控件添加到ToolStripControlHost 问题是左边和右边的空白我不想删除它们,也不想把图标移到左边的栏,然后删除右边的空白。我试图将Padding和Margin的值设置为0,但不起作用。 我发现这篇文章有类似的问题,但没有找到正确的答案。有可能做到吗 我想让

我想创建
自定义ToolStripItem
,其中包含
复选框和图标。
我想通过创建带有两个
picturebox
和标签的自定义控件来实现这一点。 左
picturebox
if for icon和右作为特殊的
复选框
向收藏夹添加位置

我将该控件添加到
ToolStripControlHost

  • 问题是左边和右边的空白我不想删除它们,也不想把图标移到左边的栏,然后删除右边的空白。我试图将
    Padding
    Margin
    的值设置为0,但不起作用。 我发现这篇文章有类似的问题,但没有找到正确的答案。有可能做到吗
  • 我想让鼠标指针上的整行高亮显示,就像ToolStripMenuItem中的普通元素一样。当我重写onMouseCenter和OnMouseLeave更改背景属性时,它只是更改托管控件的颜色,而不是antirie ToolStripControlHost。 是否可以模拟与ToolStripMenuItem相同的行为
  • 现在它看起来像图片“A”,我希望它看起来更像图片B,但带有星形复选框:

    基本上,我希望使我的CustomToolStrip项尽可能类似于ToolStripMenuItem。为单击(如果您单击文本)更改(如果您单击星号)

    有什么办法吗

    这是我的ToolStripControlHost代码的一部分:

        private void AddEvents()
        {
            this.ToolStripICItemControl.eMouseEnter += new EventHandler(On_MouseEnter);
            this.ToolStripICItemControl.eMouseLeave += new EventHandler(On_MouseLeave);
        }
        private void AutoSizeControl(Control control, int textPadding)
        {
            // Create a Graphics object for the Control.
            Graphics g = control.CreateGraphics();
    
            // Get the Size needed to accommodate the formatted Text.
            Size preferredSize = g.MeasureString(
               control.Text, control.Font).ToSize();
    
            // Pad the text and resize the control.
            this.Size = new Size(
               preferredSize.Width + 5 + 50 + (textPadding * 2),
               this.Size.Height /*+ (textPadding * 2)*/ );
    
            // Clean up the Graphics object.
            g.Dispose();
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
        }
        protected override void OnSubscribeControlEvents(Control c)
        {
            // Call the base so the base events are connected. 
            base.OnSubscribeControlEvents(c);
    
            // Cast the control to a  ToolStripCheckBox control.
            ToolStripImageAndCheckBox checkBoxToolStrip = (ToolStripImageAndCheckBox)c;
    
            // Add the event.
            checkBoxToolStrip.LabelClick += new EventHandler(checkBoxToolStrip_LabelClick);
            checkBoxToolStrip.CheckedChanged += new EventHandler(checkBoxToolStrip_CheckedChanged);
        }
        protected override void OnUnsubscribeControlEvents(Control c)
        {
            // Call the base method so the basic events are unsubscribed. 
            base.OnUnsubscribeControlEvents(c);
    
            // Cast the control to a ToolStripCheckBox control.
            ToolStripImageAndCheckBox checkBoxToolStrip = (ToolStripImageAndCheckBox)c;
    
            // Remove the event.
            checkBoxToolStrip.LabelClick -= new EventHandler(checkBoxToolStrip_LabelClick);
        }
        protected override void OnMouseEnter(EventArgs e)
        {
            DefaultBackColor = this.BackColor;
            base.OnMouseEnter(e);
            this.BackColor = Color.Aquamarine;
        }
        protected override void OnMouseLeave(EventArgs e)
        {
            base.OnMouseLeave(e);
            this.BackColor = DefaultBackColor;
        }
        void checkBoxToolStrip_LabelClick(object sender, EventArgs e)
        {
            if (Click != null)
                Click(this, e);
        }
        void checkBoxToolStrip_CheckedChanged(object sender, EventArgs e)
        {
            if (CheckedChange != null)
                CheckedChange(this, e);
        }
        void On_MouseLeave(object sender, EventArgs e)
        {
            OnMouseLeave(e);
            //throw new NotImplementedException();
        }
        void On_MouseEnter(object sender, EventArgs e)
        {
            this.Select();
            this.Focus();
            OnMouseEnter(e);
        }
    

    通过从ToolStripMenuItem驱动MyControl并重写onPaint方法,我可以完成所需的工作

    public class MyControl : ToolStripMenuItem
    {
        public MyControl(){}
        public MyControl(string text, Image image ):base (text,image){}
        public MyControl(string text):base(text){}
        public MyControl(Image image):base(image){}
        public MyControl(string text,Image image,EventHandler onClick):base(text,image,onClick){}
        public MyControl(string text, Image image,int id):base(text,image){  this.ID = id;}
        public MyControl(string text,Image image,int id,EventHandler onClick):base(text,image,onClick){this.ID = id; }
    
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
    
            if (base.Checked == false)
            {
               Rectangle rect = new Rectangle(this.Width - 20, 1, 20, 20);               
                e.Graphics.DrawImage(Properties.Resources.BlackStar, rect);
            }
            else
            { 
                Rectangle rect = new Rectangle(this.Width - 20, 1, 20, 20);
                e.Graphics.DrawImage(Properties.Resources.YellowStar, rect);
            }
        }
        public int ID { get; set; }
        public bool StarClicked { get; set; }
    
        protected override void OnMouseDown(MouseEventArgs e)
        {            
            StarClicked = e.X > (this.Width - 20);
            if (StarClicked)
            {
                this.Checked = this.Checked == true ? false : true;
            }
            else
                base.OnClick(e);
            base.OnMouseDown(e);
        }
    

    现在看起来就是这样

    表格编号:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            AddMenuElements(7);
        }
        public void AddMenuElements(int licznik)
        {
            ToolStripMenuItem wszystkie = new ToolStripMenuItem("wszystkie", SystemIcons.Question.ToBitmap());
            manu1ToolStripMenuItem.DropDownItems.Add(wszystkie);
            menuStrip1.Renderer = new ToolStripSystemRenderer();
            for (int i = 0; i < licznik; i++)
            {
                ToolStripMenuItem element = new ToolStripMenuItem(String.Format("element {0}", i), GetIcon(i),element2_Click);
                element.Visible = i % 2 == 0 ? false:true;                
                manu1ToolStripMenuItem.DropDownItems.Add(element);
            }
    
    
            for (int i = 0; i < licznik; i++)
            {
                MyControl element2 = new MyControl(String.Format("element {0}",i), GetIcon(i),element2_Click);
                element2.ID = i;
                element2.CheckedChanged += (s, e) =>
                {                    
                    MyControl control = s as MyControl;
                    manu1ToolStripMenuItem.DropDownItems[control.ID + 1].Visible = control.Checked;                  
                };
                element2.Checked = i % 2 == 0 ? false : true;
    
                wszystkie.DropDownItems.Add(element2); 
    
            }
        }
        void element2_Click(object sender, EventArgs e)
        {
            MyControl kontener = (sender as MyControl);
    
            if (kontener.ForeColor == Color.Red)
                kontener.ForeColor = Color.Black;
            else
                kontener.ForeColor = Color.Red;
    
        }
        private static Image GetIcon(int i)
        {
            Image ikona = null;
            switch (i)
            {
                case 0: ikona = SystemIcons.Application.ToBitmap();
                    break;
                case 1: ikona = SystemIcons.Asterisk.ToBitmap();
                    break;
                case 2: ikona = SystemIcons.WinLogo.ToBitmap();
                    break;
                case 3: ikona = SystemIcons.Exclamation.ToBitmap();
                    break;
                case 4: ikona = SystemIcons.Hand.ToBitmap();
                    break;
                case 5: ikona = SystemIcons.Warning.ToBitmap();
                    break;
                default: ikona = SystemIcons.Shield.ToBitmap();
                    break;
            }
            return ikona;
        }   
    }
    

    公共部分类表单1:表单
    {
    公共表格1()
    {
    初始化组件();
    添加元素(7);
    }
    公共void AddMenuElements(int-licznik)
    {
    ToolStripMenuItem wszystkie=新的ToolStripMenuItem(“wszystkie”,SystemIcons.Question.ToBitmap());
    manu1ToolStripMenuItem.DropDownItems.Add(wszystkie);
    menuStrip1.Renderer=新工具StripSystemRenderer();
    对于(int i=0;i
    {                    
    MyControl control=s作为MyControl;
    manu1ToolStripMenuItem.DropDownItems[control.ID+1]。可见=控件。选中;
    };
    element2.Checked=i%2==0?false:true;
    wszystkie.DropDownItems.Add(element2);
    }
    }
    无效元素2_单击(对象发送者,事件参数e)
    {
    MyControl kontener=(发送方作为MyControl);
    if(kontener.ForeColor==颜色.红色)
    kontener.ForeColor=颜色。黑色;
    其他的
    kontener.ForeColor=颜色。红色;
    }
    私有静态图像获取图标(int i)
    {
    图像ikona=null;
    开关(一)
    {
    案例0:ikona=SystemIcons.Application.ToBitmap();
    打破
    案例1:ikona=SystemIcons.Asterisk.ToBitmap();
    打破
    案例2:ikona=SystemIcons.WinLogo.ToBitmap();
    打破
    案例3:ikona=SystemIcons.感叹号.ToBitmap();
    打破
    案例4:ikona=SystemIcons.Hand.ToBitmap();
    打破
    案例5:ikona=SystemIcons.Warning.ToBitmap();
    打破
    默认值:ikona=SystemIcons.Shield.ToBitmap();
    打破
    }
    返回伊科纳;
    }   
    }
    

    基本上,它做了我想要的,我只需要阻止它在点击星星时消失。
    谢谢你的帮助@LarsTech它给了我一个如何做的提示

    你的问题不是很清楚。如果你想要一些完整的代码,你应该用一些屏幕截图来描述你想要的(比如一些草图就足够了)。如果你需要更正,你应该发布你的代码,显示对说明性屏幕截图不满意的内容。请参阅@LarsTech-感谢链接,但这对我没有帮助,因为我不知道如何将新的渲染方法添加到
    ToolStripControlHost
    @KingKing-感谢您的说明,我会尽量让它更清楚。该链接旨在显示如何创建您描述的菜单项,它不需要使用ToolStripControlHost或PictureBox。顺便说一句,你所展示的图片中没有一个复选框。@LarsTech-谢谢你的提醒,我将更新图片,以更好地展示我想要实现的目标。我正在尝试实现此解决方案,但无法将复选框移到左侧。我在帖子中更新了控件的工作方式。我希望这将有助于理解我想做什么。