Как мне сделать мою форму прозрачной, но что я не рисую на ней? - PullRequest
12 голосов
/ 09 октября 2009

Я попытался установить непрозрачность моей формы на 50%, а затем нарисовал на ней строку. Кажется, что строка, которую я рисую на ней, также имеет непрозрачность 50%. Как бы нарисовать непрозрачную строку, но позволить фону формы показывать через 50%?

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

Чтобы уточнить, я хочу, чтобы фон формы был черным на 80% непрозрачным по отношению к тому, что находится внизу, а затем я хочу нарисовать на нем текст и т. Д. И сделать его на 100% непрозрачным.

Ответы [ 7 ]

19 голосов
/ 12 октября 2009

Это очень легко сделать в WPF:

  1. Установить WindowStyle = "None" в окне (примечание: это необходимо, у вас не может быть прозрачности и стандартного окна Chrome)
  2. Set AllowsTransparency = "True" в окне
  3. Установка фона в окне с помощью кисти с прозрачностью, например, Background = "# AAFFFFFF"

Вот краткий пример:

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Height="300" Width="300" AllowsTransparency="True" Background="#AAFFFFFF" WindowStyle="None">
<Grid>
    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="20" FontWeight="Bold">Hello World!</TextBlock>
</Grid>

Теперь, очевидно, поскольку вы отключили стандартный Windows Chrome, вам нужно будет предоставить собственную кнопку, чтобы закрыть / свернуть / развернуть / перетащить окно. Вы можете сделать это довольно легко самостоятельно или можете приобрести что-то вроде Blendables , которое поставляется с элементом управления «Chromeless Window», который вы можете использовать.

4 голосов
/ 09 октября 2009

Вы можете использовать TransparencyKey.

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.transparencykey.aspx

1 голос
/ 13 октября 2009

Один из обходных путей, который приходит на ум, - это использование двух окон, наложенных друг на друга. Визуализируйте «нижнее» окно с непрозрачностью 50%, а затем владелец перетянет ваш текст в окно, наложенное поверх другого. Если вы работаете с дисплеями типа lable, это может быть просто, но может быстро усложниться, если вам нужно много пользовательского ввода, который затем может быть отфильтрован до вашего «основного» или «нижнего» окна.

Итак, я заставил его работать, но это немного коротко. Решение с двумя окнами казалось многообещающим, пока я не обнаружил, что .Net или Win32 делает что-то странное с автоматическим воспитанием, когда вы даже неявно ссылаетесь на него. Вероятно, это связано с тем, как сообщения перекачиваются. Основной родительский объект содержит насос сообщений приложения, а int guess неявно является родительским ... ... 1003 *

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


// the "main" or transparent window. Notice it just sets and runs the timer
using System;
using System.Windows.Forms;
namespace TransparencyPlusNottransparentTest
{
    public partial class FormMain : Form
    {
        public FormMain()
        {
            InitializeComponent();
        }

    private void timer1_Tick(object sender, EventArgs e)
    {
        Program.ShowNontransparency();
    }
}

}

// «верхнее» или непрозрачное окно. Обратите внимание, что владелец привлекает // прозрачный фон. Настройки времени разработки также не имеют границ и т. Д. использование System.Drawing; используя System.Windows.Forms;

пространство имен TransparencyPlusNottransparentTest { открытый частичный класс FormTop: Form { public FormTop () { InitializeComponent (); BackColor = Color.Firebrick; TransparencyKey = Color.Firebrick; }

    private void FormTop_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.DrawString("Hello Whirrled!", new Font("Tahoma", 14f), Brushes.Black, 10f, 10f );
    }
}

}

// Контроль всего этого шпиля. Он создает оба окна, // устанавливает главное как главное окно приложения и размещает общедоступный // хакерский метод для принудительного отображения непрозрачного окна сверху // и смещение, чтобы оно не закрывало верхнюю часть главного окна. используя Систему; использование System.Drawing; используя System.Windows.Forms;

пространство имен TransparencyPlusNottransparentTest { Программа статического класса { приватная статическая FormMain _formMain; приватный статический FormTop _formTop; private const int XY_OFFSET = 30;

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        _formTop = new FormTop();
        _formTop.Show(null);

        _formMain = new FormMain();

        Application.Run(_formMain);
    }

    public static void ShowNontransparency()
    {
        _formTop.Location = 
            new Point(
            _formMain.Location.X + XY_OFFSET, 
            _formMain.Location.Y + XY_OFFSET);

        _formTop.BringToFront();
    }
}

}

0 голосов
/ 12 октября 2009

Я предполагаю, что это проект WinForms, хотя вы сказали, что захотите попробовать WPF.

Позвольте мне переключиться на мою шапку с боковым мышлением: По какой-то конкретной причине вы не могли просто подделать так? Например, создайте растровое изображение в PhotoShop Elements или Paint Shop Pro или что-нибудь подобное, чтобы вы установили весь фон WinForm, и вы просто нарисуете частично прозрачную область, над которой элементы управления будут размещены справа. на этом растровом изображении?

0 голосов
/ 12 октября 2009

В winforms MSDN говорит следующее:

Свойство Opacity позволяет вам указать уровень прозрачности для форма и ее элементы управления. Когда это для свойства установлено значение меньше 100 процентов (1,00), вся форма, в том числе границы, сделано больше прозрачный.

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

0 голосов
/ 12 октября 2009

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

Затем создайте всех своих дочерних элементов в отдельном контейнере / панели (сам по себе аналог просвечивающей панели, созданной выше), и пусть они вообще не будут отображать фон.

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

0 голосов
/ 09 октября 2009

в перечислении ControlStyles MSDN есть значение, называемое SupportsTransparentBackColor. В вашем конструкторе формы запустите это:

SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.SupportsTransparentBackColor, true);

тогда вы можете установить цвет фона на Color.Transparent.

Надеюсь, это поможет.

...