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

Другой способ генерировать военные файлы без номера версии состоит в том, чтобы сохранить свойство, app.version, пустой в application.properties

12
задан esac 11 October 2009 в 15:57
поделиться

7 ответов

This is very easily done in WPF:

  1. Set WindowStyle="None" on the Window (note: this is required, you cannot have Transparency and the standard windows chrome)
  2. Set AllowsTransparency="True" on the Window
  3. Set a Background on the Window using a brush with transparency, such as Background="#AAFFFFFF"

Here's a quick sample:

<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>

Now obviously, since you've disabled the standard Windows chrome, you will need to supply your own button to close/minimize/maximize/drag the window. You can do this pretty easily yourself or you could look into purchasing something like Blendables which comes with a "Chromeless Window" control that you could use.

19
ответ дан 2 December 2019 в 06:26
поделиться
4
ответ дан 2 December 2019 в 06:26
поделиться

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

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

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


// 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();
    }
}

}

// the "top" or not transparent window. Notice it does owner draw on // transparent background. The design-time settings are also sans border etc. using System.Drawing; using System.Windows.Forms;

namespace TransparencyPlusNottransparentTest { public partial class 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 );
    }
}

}

// The control of this whole spiel. It instantiates both windows, // sets the main as the main app window and hosts the public // hacky method to force the non-transparent window to show up on top // and offset so it doesn't obscure the top of the main window. using System; using System.Drawing; using System.Windows.Forms;

namespace TransparencyPlusNottransparentTest { static class Program { 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();
    }
}

}

1
ответ дан 2 December 2019 в 06:26
поделиться

in the ControlStyles enumeration MSDN there is a value called SupportsTransparentBackColor. In your form contructor run this:

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

then you can set the background color to Color.Transparent.

Hope this helps.

0
ответ дан 2 December 2019 в 06:26
поделиться

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

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

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

0
ответ дан 2 December 2019 в 06:26
поделиться

В winforms MSDN сообщает следующее:

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

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

0
ответ дан 2 December 2019 в 06:26
поделиться

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

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

0
ответ дан 2 December 2019 в 06:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: