带有图标和复选框的ToolStripControlHost。如何突出显示所选项目?在图标字段中添加图标?

时间:2013-10-22 14:37:03

标签: c# winforms .net-4.0 custom-controls toolstripitem

我想创建Custom ToolStripItem,其中包含checkbox和Icon。 我通过使用两个picturebox和标签创建自定义控件来实现这一点。 如果是图标则向左picturebox,向右移动checkbox作为特殊ToolStripControlHost向收藏夹添加位置。

我将该控件添加到Padding

  1. 问题是左右两侧的空白区域我不想删除它们或将图标移动到左侧栏并移除右侧空格。我尝试将Margin 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); } 值设置为0,但它不起作用。 我发现有类似问题的帖子,但没有正确的答案。有可能吗?
  2. enter image description here

    1. 我想在MouseEnter中使整行突出显示,就像ToolStripMenuItem中的普通元素一样。当我重写OnMouseEnter和OnMouseLeave更改背景属性时,它只是更改托管控件的颜色而不是antirie ToolStripControlHost。 是否可以模拟与ToolStripMenuItem相同的行为?
    2. 现在它看起来像'A',我希望它看起来更像是图片B但是有星形复选框:

      enter image description here

      基本上我想让My CustomToolStrip项目尽可能类似于ToolStripMenuItem。为点击(如果您点击文字) ChackChange(如果您点击星标)

      的单独活动

      任何想法如何做到这一点?

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

      {{1}}

1 个答案:

答案 0 :(得分:1)

我通过从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);
    }

现在的样子

http://i.stack.imgur.com/ZwESK.png

表单代码:

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

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