Прозрачный фон на winforms? - PullRequest
       5

Прозрачный фон на winforms?

38 голосов
/ 08 декабря 2010

Я хотел сделать свои окна прозрачными, поэтому удалил границы, элементы управления и все остальное, оставив только поле форм, затем попытался сделать BackColor и TransparencyKey прозрачными, но это не сработало, поскольку BackColor не будет принимать прозрачный цвет. После поиска вокруг я нашел это в msdn:

SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.BackColor = Color.Transparent;
this.TransparencyKey = BackColor;

К несчастью, это тоже не сработало. Я все еще получаю серый или любой другой выбранный цвет фона.

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

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

Надеюсь, что кто-нибудь может осветить мой путь.

UPDATE:

изображение удалено при решении проблемы

Ответы [ 9 ]

66 голосов
/ 08 декабря 2010

Способ, который я использовал ранее, состоит в том, чтобы использовать дикий цвет (цвет, который никто в здравом уме не использовал бы) для BackColor, а затем установить для него ключ прозрачности.

this.BackColor = Color.LimeGreen;
this.TransparencyKey = Color.LimeGreen;
21 голосов
/ 28 января 2012

Простое решение для получения прозрачного фона в форме окон - переписать метод OnPaintBackground следующим образом:

protected override void OnPaintBackground(PaintEventArgs e)
{
    //empty implementation
}

(обратите внимание, что base.OnpaintBackground(e) удален из функции)

7 голосов
/ 30 августа 2014

Вот мое решение:

В конструкторы добавьте эти две строки:

        this.BackColor = Color.LimeGreen;
        this.TransparencyKey = Color.LimeGreen;

В вашей форме добавьте этот метод:

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        e.Graphics.FillRectangle(Brushes.LimeGreen, e.ClipRectangle);
    }

Будьте предупрежденыЭта форма не только полностью прозрачна внутри рамки, но вы также можете щелкнуть по ней.Однако было бы здорово нарисовать на нем изображение и сделать так, чтобы форму можно было перетаскивать повсюду, чтобы создать форму произвольной формы.

6 голосов
/ 18 марта 2014

Я пробовал решения выше (а также) многие другие решения из других постов.

В моем случае я сделал это со следующей настройкой:

public partial class WaitingDialog : Form
{
    public WaitingDialog()
    {
        InitializeComponent();

        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        this.BackColor = Color.Transparent;

        // Other stuff
    }

    protected override void OnPaintBackground(PaintEventArgs e) { /* Ignore */ }
}

Как видите, это смесь ранее заданных ответов.

4 голосов
/ 09 июля 2015

Мое решение было чрезвычайно близко к решению Джоэла (не Этертон, просто Джоэл):

public partial class WaitingDialog : Form
{
    public WaitingDialog()
    {
        InitializeComponent();

        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        this.BackColor = Color.Transparent;
        this.TransparencyKey = Color.Transparent; // I had to add this to get it to work.

        // Other stuff
    }

    protected override void OnPaintBackground(PaintEventArgs e) { /* Ignore */ }
}
2 голосов
/ 08 мая 2015

Я попробовал почти все это. но все еще не мог работать. Наконец я обнаружил, что это из-за проблем с 24-битной картой. Если вы попробовали какое-то растровое изображение менее 24 бит. Большинство из этих методов должны работать.

2 голосов
/ 23 февраля 2015

Я нарисовал заставку (32 Bpp BGRA) с «прозрачным» цветом фона в VS2013 и поместил изображение в поле для отображения. Для меня сработала комбинация приведенных выше ответов:

    public Form1()
    {
        InitializeComponent();

        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        this.BackColor = this.pictureBox1.BackColor;
        this.TransparencyKey = this.pictureBox1.BackColor;
    }

Поэтому убедитесь, что везде используется один и тот же BackColor, и установите этот цвет как TransparencyKey.

1 голос
/ 08 декабря 2010

Что мне подходит, так это использование определенного цвета вместо реальной способности .png для представления прозрачности.

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

Установите изображение в качестве свойства формы BackgrounImage и установите цвет в качестве формы TransparencyKey.Нет необходимости изменять стиль элемента управления и не нужен BackColor.

Я попробовал это прямо сейчас, и это сработало для меня ...

0 голосов
/ 08 декабря 2010

Должно ли это иметь какое-либо отношение к "непрозрачности" формы / фона?Вы пробовали opacity = 0

Также посмотрите, поможет ли эта статья CP :

...