Announcement

Collapse
No announcement yet.

Toolbox mit Icons

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Toolbox mit Icons

    Hallo zusammen,

    ich hab nach langem Suchen endlich ein ToolboxControl gefunden, welches zumindest zum größten Teil das tut, was ich möchte.
    Was mir jedoch sehr fehlt, ist die möglichkeit, vor den Controlnamen das passende Icon anzuzeigen.
    Das ganze Teil leitet sich von ListBox ab und die scheint sowas nicht zu können. Ich hab auch versucht das ganze nach ListView umzumodeln, aber das wollte auch nicht wirklich klappen.
    Vielleicht hat ja von Euch einer ne gute Idee.

    Das hier ist die Klasse:
    [highlight=c#]
    internal class ToolboxService : ListBox, IToolboxService
    {
    internal Control designPanel = null;

    public ToolboxService()
    {
    }

    public void AddCreator(System.Drawing.Design.ToolboxItemCreato rCallback creator, string format, System.ComponentModel.Design.IDesignerHost host)
    {
    // No implementation
    }

    public void AddCreator(System.Drawing.Design.ToolboxItemCreato rCallback creator, string format)
    {
    // No implementation
    }

    public void AddLinkedToolboxItem(System.Drawing.Design.Toolbox Item toolboxItem, string category, System.ComponentModel.Design.IDesignerHost host)
    {
    // No implementation
    }

    public void AddLinkedToolboxItem(System.Drawing.Design.Toolbox Item toolboxItem, System.ComponentModel.Design.IDesignerHost host)
    {
    // No implementation
    }

    public void AddToolboxItem(System.Drawing.Design.ToolboxItem toolboxItem, string category)
    {
    AddToolboxItem(toolboxItem);
    }

    public void AddToolboxItem(System.Drawing.Design.ToolboxItem toolboxItem)
    {
    Items.Add(toolboxItem);
    }

    public System.Drawing.Design.ToolboxItem DeserializeToolboxItem(object serializedObject, System.ComponentModel.Design.IDesignerHost host)
    {
    return null;
    }

    public System.Drawing.Design.ToolboxItem DeserializeToolboxItem(object serializedObject)
    {
    return null;
    }

    public System.Drawing.Design.ToolboxItem GetSelectedToolboxItem(System.ComponentModel.Desig n.IDesignerHost host)
    {
    return GetSelectedToolboxItem();
    }

    public System.Drawing.Design.ToolboxItem GetSelectedToolboxItem()
    {
    if (base.SelectedIndex == -1)
    return null;
    else
    return (ToolboxItem)base.SelectedItem;
    }

    public System.Drawing.Design.ToolboxItemCollection GetToolboxItems(string category, System.ComponentModel.Design.IDesignerHost host)
    {
    return GetToolboxItems();
    }

    public System.Drawing.Design.ToolboxItemCollection GetToolboxItems(string category)
    {
    return GetToolboxItems();
    }

    public System.Drawing.Design.ToolboxItemCollection GetToolboxItems(System.ComponentModel.Design.IDesi gnerHost host)
    {
    return GetToolboxItems();
    }

    public System.Drawing.Design.ToolboxItemCollection GetToolboxItems()
    {
    ToolboxItem[] t = new ToolboxItem[Items.Count];
    Items.CopyTo(t, 0);

    return new ToolboxItemCollection(t);
    }

    public bool IsSupported(object serializedObject, System.Collections.ICollection filterAttributes)
    {
    return false;
    }

    public bool IsSupported(object serializedObject, System.ComponentModel.Design.IDesignerHost host)
    {
    return false;
    }

    public bool IsToolboxItem(object serializedObject, System.ComponentModel.Design.IDesignerHost host)
    {
    return false;
    }

    public bool IsToolboxItem(object serializedObject)
    {
    return false;
    }

    public void Refresh()
    {
    base.Refresh();
    }

    public void RemoveCreator(string format, System.ComponentModel.Design.IDesignerHost host)
    {
    // No implementation
    }

    public void RemoveCreator(string format)
    {
    // No implementation
    }

    public void RemoveToolboxItem(System.Drawing.Design.ToolboxIte m toolboxItem, string category)
    {
    RemoveToolboxItem(toolboxItem);
    }

    public void RemoveToolboxItem(System.Drawing.Design.ToolboxIte m toolboxItem)
    {
    Items.Remove(toolboxItem);
    }

    public void SelectedToolboxItemUsed()
    {
    base.SelectedIndex = -1;
    }

    public object SerializeToolboxItem(System.Drawing.Design.Toolbox Item toolboxItem)
    {
    return null;
    }

    public bool SetCursor()
    {
    if (base.SelectedIndex == -1)
    designPanel.Cursor = Cursors.Default;
    else
    designPanel.Cursor = Cursors.Cross;

    return true;
    }

    public void SetSelectedToolboxItem(System.Drawing.Design.Toolb oxItem toolboxItem)
    {
    base.SelectedItem = toolboxItem;
    }

    public System.Drawing.Design.CategoryNameCollection CategoryNames
    {
    get
    {
    return null;
    }
    }

    public string SelectedCategory
    {
    get
    {
    return null;
    }
    set
    {
    }
    }

    private bool ShouldSerializeItems()
    {
    return false;
    }
    }
    [/highlight]

    Aufgerufen wird das ganze dann so:
    [highlight=c#]
    private void PopulateToolbox(IToolboxService toolbox)
    {
    toolbox.AddToolboxItem(new ToolboxItem(typeof(Button)));
    toolbox.AddToolboxItem(new ToolboxItem(typeof(ListBox)));
    toolbox.AddToolboxItem(new ToolboxItem(typeof(TextBox)));
    toolbox.AddToolboxItem(new ToolboxItem(typeof(Label)));
    toolbox.AddToolboxItem(new ToolboxItem(typeof(CheckBox)));
    toolbox.AddToolboxItem(new ToolboxItem(typeof(ComboBox)));
    toolbox.AddToolboxItem(new ToolboxItem(typeof(GroupBox)));
    toolbox.AddToolboxItem(new ToolboxItem(typeof(Rahmen)));
    toolbox.AddToolboxItem(new ToolboxItem(typeof(PictureBox)));
    toolbox.AddToolboxItem(new ToolboxItem(typeof(DatePicker)));
    toolbox.AddToolboxItem(new ToolboxItem(typeof(RadioBox)));
    toolbox.AddToolboxItem(new ToolboxItem(typeof(RadioButton)));
    toolbox.AddToolboxItem(new ToolboxItem(typeof(TabControl)));
    toolbox.AddToolboxItem(new ToolboxItem(typeof(TreeView)));
    toolbox.AddToolboxItem(new ToolboxItem(typeof(DataGridView)));
    }
    [/highlight]

  • #2
    Wenn ein Control das nicht hergibt würde ich nicht verzweifelt versuch das da irgendwie reinzumodeln, sondern mir dafür selber was bauen. Bau Dir ein CustomControl und pack die in ein FlowLayoutPanel. Dann kannste jedes Item so gestalten wie Du willst und hast eine tolle Liste

    Comment


    • #3
      Du kannst die Items in der Liste auch einfach selber zeichnen. Dazu einfach in deiner ToolboxService Klasse OnDrawItem überscheiben. Damit der Event auch wirklich zieht mußt du den DrawMode des Controls noch irgendwo auf OwnerDraw setzen und vermutlich die ItemHeight hochschrauben da die Bitmaps doch etwas höher sind als die 'normale' Texthöhe.

      [Highlight=C#]protected override void OnDrawItem(DrawItemEventArgs e)
      {
      if (Items.Count == 0)
      return;

      e.DrawBackground();

      Image image = ((ToolboxItem)Items[e.Index]).Bitmap;
      e.Graphics.DrawImage(image, e.Bounds.X, e.Bounds.Y);

      Rectangle bounds = new Rectangle(e.Bounds.X + image.Width + 5, e.Bounds.Y, e.Bounds.Width - image.Width - 5, e.Bounds.Height);
      e.Graphics.DrawString(Items[e.Index].ToString(), e.Font, Brushes.Black, bounds, StringFormat.GenericTypographic);

      e.DrawFocusRectangle();
      }[/Highlight]

      Comment


      • #4
        Hallo und danke Euch zwei.

        Ich hab es jetzt erst einmal auf die "einfache" Art probiert und Ralfs Code 1:1 übernommen. Den Erfolg hab ich mal als Bild angehängt.
        Da ich von Drawing leider null Ahnung hab, dazu noch ein paar Fragen.

        Woher bekommt er die angezeigten Bitmaps?
        Wieso zeigt er zb. beim Button auch das Button-Bitmap aber bei den meisten nur das Symbol vom UserControl? Kann man das vielleicht steuern?

        Egal welche größe ich bei ItemHight einstelle, es sieht immer so aus wie auf dem Bild. Dort hatte ich spaßeshalber 100 eingestellt
        Attached Files

        Comment


        • #5
          Hab grad was entdeckt, was erklärt warum das Button-Symbol angezeigt wird.
          Das war noch ein Relikt aus meinen früheren Versuchen das was anzeigen zu lassen. So hatte ich vor die Klasse meines Buttons folgendes geschrieben:

          [ToolboxBitmap(typeof(Button))]

          Hat damals natürlich keinen Effekt gehabt.
          Ich werd das mal auf meine anderen Controls anwenden

          Kann man über sowas auch den angezeigten Namen des Controls beeinflussen?

          Comment


          • #6
            Wie du im Code siehst hole ich mir den Text und das Image aus dem ToolBoxItem. Und ein Bitmap kommt da, wie du festgestellt hast, über das ToolboxBitmapAttribute rein. Der angezeigte Text entspricht im gezeigten Code der DisplayName Property des ToolBoxItems. Die entspricht erstmal dem Klassennamen. Es hindert dich aber keiner daran den DisplayName des ToolBoxItems zu ändern.

            Comment


            • #7
              Beim Zeichnen kannst Du alles hinzeichnen was Du willst. Du hast irgendwelche Daten und die werden dann hingezeichnet.

              Im Endeffekt stehts ja dort:

              DrawBackground zeichnet den Hintergrund
              DrawImage mal das Icon hin
              DrawString zeichnet den Text (Items[e.Index].ToString() ist der Text)
              DrawFocusRectangle zeichnet wohl einen Rahmen um das Ding wenn es ausgewählt ist

              Innerhalb dieser Grenzen kannst Du nun reinzeichnen was Du willst. Allerdings wird es wirklich nur gezeichnet. Verhalten tut es sich immer noch so ein ToolBoxItem. Sobald Du Verhalten haben willst was abweicht (klick auf Bild macht was anderes als klick auf Text), dann würde ich Dir zu meiner Vorgehensweise raten (Ich bin per se kein Freund von selbstgezeichneten Geschichten )

              Comment


              • #8
                Ok, das passt jetzt alles.
                Danke für Eure Hilfe

                Comment

                Working...
                X