Подтвердить что ты не робот

Как сделать свою форму прозрачной, но что я на ней рисую?

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

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

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

4b9b3361

Ответ 1

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

  • Установите WindowStyle = "Нет" в окне (обратите внимание: это необходимо, вы не можете иметь прозрачность и стандартные хромированные окна)
  • Set AllowsTransparency = "True" в окне
  • Установите фон в окне с помощью кисти с прозрачностью, например 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, вам нужно будет предоставить свою собственную кнопку, чтобы закрыть/свернуть/увеличить/перетащить окно. Вы можете сделать это довольно легко самостоятельно, или вы можете заглянуть в покупку чего-то вроде Blendables, который поставляется с элементом управления Chromeless Window, который вы можете использовать.

Ответ 3

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

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

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


//главное или прозрачное окно. Обратите внимание, что он просто устанавливает и запускает таймер
использование системы;
используя System.Windows.Forms;
пространство имен TransparencyPlusNottransparentTest
{   public partial class FormMain: Форма   {       public FormMain()       {           InitializeComponent();       }

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

}

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

пространство имен TransparencyPlusNottransparentTest {   открытый частичный класс FormTop: форма   {       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 );
    }
}

}

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

пространство имен TransparencyPlusNottransparentTest {   программа статического класса   {       private static FormMain _formMain;       private static 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();
    }
}

}

Ответ 4

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

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 7

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

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