Сделать контроль прозрачным - PullRequest
16 голосов
/ 20 февраля 2012

В настоящее время я разрабатываю простой инструмент для редактирования изображений с использованием Winforms и .NET 3.5 (рабочая среда).

У меня есть требование, что когда пользователь нажимает кнопку выбора инструмента, появляется квадрат (прямоугольник в C #), который может масштабироваться от 100x100 до 400x400. Я исправил этот бит - проблема заключается в том, чтобы сделать фон прямоугольника прозрачным.

Мне немного непонятно, поддерживается ли прозрачность в .NET 3.5, я пробовал следующее:

SetStyle(ControlStyles.SupportsTransparentBackColor, true);
pnlSelectArea.BackColor = Color.Transparent;
pnlSelectArea.ForeColor = Color.Transparent;
selectArea1.BackColor = Color.Transparent;
selectArea1.ForeColor = Color.Transparent;

Но это не имеет никакого эффекта - любой совет был бы оценен.

Ответы [ 4 ]

45 голосов
/ 20 февраля 2012

Это мой специальный элемент управления, который содержит свойство непрозрачности, он работает на 100%:

using System;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Design;

public class TranspCtrl : Control
{
    public bool drag = false;
    public bool enab = false;
    private int m_opacity = 100;

    private int alpha;
    public TranspCtrl()
    {
        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        SetStyle(ControlStyles.Opaque, true);
        this.BackColor = Color.Transparent;
    }

    public int Opacity
    {
        get
        {
            if (m_opacity > 100)
            {
                m_opacity = 100;
            }
            else if (m_opacity < 1)
            {
                m_opacity = 1;
            }
            return this.m_opacity;
        }
        set
        {
            this.m_opacity = value;
            if (this.Parent != null)
            {
                Parent.Invalidate(this.Bounds, true);
            }
        }
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle = cp.ExStyle | 0x20;
            return cp;
        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        Rectangle bounds = new Rectangle(0, 0, this.Width - 1, this.Height - 1);

        Color frmColor = this.Parent.BackColor;
        Brush bckColor = default(Brush);

        alpha = (m_opacity * 255) / 100;

        if (drag)
        {
            Color dragBckColor = default(Color);

            if (BackColor != Color.Transparent)
            {
                int Rb = BackColor.R * alpha / 255 + frmColor.R * (255 - alpha) / 255;
                int Gb = BackColor.G * alpha / 255 + frmColor.G * (255 - alpha) / 255;
                int Bb = BackColor.B * alpha / 255 + frmColor.B * (255 - alpha) / 255;
                dragBckColor = Color.FromArgb(Rb, Gb, Bb);
            }
            else
            {
                dragBckColor = frmColor;
            }

            alpha = 255;
            bckColor = new SolidBrush(Color.FromArgb(alpha, dragBckColor));
        }
        else
        {
            bckColor = new SolidBrush(Color.FromArgb(alpha, this.BackColor));
        }

        if (this.BackColor != Color.Transparent | drag)
        {
            g.FillRectangle(bckColor, bounds);
        }

        bckColor.Dispose();
        g.Dispose();
        base.OnPaint(e);
    }

    protected override void OnBackColorChanged(EventArgs e)
    {
        if (this.Parent != null)
        {
            Parent.Invalidate(this.Bounds, true);
        }
        base.OnBackColorChanged(e);
    }

    protected override void OnParentBackColorChanged(EventArgs e)
    {
        this.Invalidate();
        base.OnParentBackColorChanged(e);
    }
}
4 голосов
/ 20 февраля 2012

Вам нужно будет использовать свойство Opacity и установить его в ноль, чтобы сделать форму невидимой.

Если вы хотите сделать элемент управления прозрачным, как вы пытались в своем примере, см. Эту статью

Как: дать вашему элементу управления прозрачный фон

В нем говорится, что код, который вы написали, должен быть в конструкторе элемента управления.Следовательно, я думаю, вам нужно будет создать пользовательский элемент управления, основанный на типе вашего pnlSelectArea, наиболее вероятно, на кнопке.В конструкторе этого пользовательского элемента управления вы можете написать код для установки его стиля и цвета.

1 голос
/ 15 декабря 2015

Вот что у меня сработало, потому что другие решения не работали.

Это с прозрачным UserControl, добавленным в коллекцию элементов управления ListView / TreeView

Я знаю, что это говорит ButtonRenderer, но он долженработать для любых элементов управления.

В UserControl:

protected override void OnPaint(PaintEventArgs e)
{
    ButtonRenderer.DrawParentBackground(e.Graphics, this.ClientRectangle, this);
}

в родительском элементе управления:

protected override void WndProc(ref Message m) 
{
    if(m.Msg == 0xF)
        foreach(Control c in this.Controls) { c.Invalidate(); c.Update(); }

    base.WndProc(ref m);
}
0 голосов
/ 13 октября 2015

большой !!Мне наконец-то удалось нарисовать прозрачные фигуры.Я добавил виртуальный метод

Draw(g);

прямо перед

bckColor.Dispose();
g.Dispose();
base.OnPaint(e);

и в конце объявил виртуальный метод

protected virtual void Draw(Graphics g){ }

Теперь я могу продолжитьсоздание собственных прозрачных фигур, графики и т.д ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...