Эмулировать стиль системы в пользовательском .NET Combobox - PullRequest
0 голосов
/ 29 ноября 2018

Я получил класс ComboBox для того, чтобы иметь собственный макет элементов списка.Это комбинированный список в стиле DropDown, который имеет приятный внешний вид, в то время как пользовательский выглядит как старый.

Custom Combobox vs Default

Есть лиспособ эмулировать или заставить элемент управления рисовать макет "стиль по умолчанию Windows", сохраняя при этом собственный дизайн?Это стиль, подобный правому на изображении выше, с градиентным фоном (или чем угодно, в зависимости от версии windows).

Это то, что я сделал до сих пор:

    public ComboBoxRGB()
    {
        this.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
        this.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
    }

    protected override void OnDrawItem(System.Windows.Forms.DrawItemEventArgs e)
    {
        base.OnDrawItem(e);

        if (Items.Count > 0)
        {
            if (e.Index > -1)
            {
                if (Items[e.Index] == null) return;

                int BarWidth = 16;
                int BarSpacing = 1;
                int Spacing_Top = 2;
                int Spacing_Left = 3;
                int Spacing_Right = 4;

                ComboBoxRGBItem item;
                try
                {
                    item = (ComboBoxRGBItem)Items[e.Index];
                }
                catch { return; }

                e.DrawBackground();
                e.DrawFocusRectangle();

                //Draw color indicator
                System.Drawing.SolidBrush bColor = new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(item.Red, item.Green, item.Blue));
                e.Graphics.FillRectangle(bColor, Spacing_Left + e.Bounds.Left, e.Bounds.Top + Spacing_Top, 12, 12);

                //Draw text
                System.Drawing.SolidBrush sbText = (e.State == System.Windows.Forms.DrawItemState.Selected) ? new System.Drawing.SolidBrush(System.Drawing.Color.White) : new System.Drawing.SolidBrush(System.Drawing.Color.Black);
                e.Graphics.DrawString(item.Text, e.Font, sbText, Spacing_Left + e.Bounds.Left + BarWidth + Spacing_Right, e.Bounds.Top);

            } //IF_Index
        } //IF_Items_Count
    }

Я был бы очень рад, если бы кто-нибудь имел представление о том, как это сделать.Я хотел бы попытаться эмулировать внешний вид вручную, поскольку это изменяется от версии Windows к версии.

1 Ответ

0 голосов
/ 10 декабря 2018

Мне не удалось найти информацию об этом в Интернете, поэтому я полагаю, что невозможно автоматически нарисовать фон с помощью системного стиля по умолчанию.

На данный момент используемое решение заключается в рисованииэто полностью вручную, через переопределение метода Paint, но для этого необходимо принять во внимание, какая версия Windows выполняется, и использовать различные дизайны для рисования элемента управления.

В случае, если у кого-то есть другое решение или любой другойпредложение, пожалуйста, дайте мне знать.

...