C # Windows Forms полупрозрачность - PullRequest
0 голосов
/ 24 июня 2018

Я уже прочитал много тем о непрозрачности / прозрачности в Windows Forms в C #, но это не тот эффект, который я хотел бы получить.Я бы хотел, чтобы Form был на 100% прозрачным, но прозрачность Panel была настраиваемой, и эффект прозрачности переносился на элементы, лежащие в основе формы (рабочий стол Windows, веб-браузер и т. Д.).Прикрепленное фото показывает эффект, который я хотел бы получить (я сделал их в графической программе).Буду благодарен за вашу помощь.

Here is a photo showing the effect I want to get

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

OP : Если есть какой-либо другой язык / среда, в которой я могу решить эту проблему, конечно, я готов попробовать.

Таким образом, в дополнение к решениям Windows Forms, я также поделюсь решением WPF (которое является лучшей средой для удовлетворения этого требования):

  • Windows Forms - Owned Forms
  • Windows Forms - Многоуровневая Windows
  • WPF - Прозрачная форма и непрозрачность управления

Windows Forms - Собственные формы

Как вариант, вы можетеиспользуйте собственные формы.

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

enter image description here

public partial class MyOwnerForm : Form
{
    public MyOwnerForm()
    {
        InitializeComponent();
        this.BackColor = Color.Magenta;
        this.TransparencyKey = Color.Magenta;
        this.StartPosition = FormStartPosition.Manual;
        this.DesktopLocation = new Point(100, 100);
        this.ClientSize = new Size(330, 330);
    }
    protected override void OnShown(EventArgs e)
    {
        base.OnShown(e);
        CreateForm(1, new Point(10, 10), new Size(150, 150)).Show();
        CreateForm(0.75, new Point(170, 10), new Size(150, 150)).Show();
        CreateForm(0.50, new Point(10, 170), new Size(150, 150)).Show();
        CreateForm(0.25, new Point(170, 170), new Size(150, 150)).Show();
    }
    protected override void OnMove(EventArgs e)
    {
        base.OnMove(e);
        if(OwnedForms.Length>0)
        {
            var p = PointToScreen(new Point(10, 10));
            var dx = p.X - OwnedForms[0].Location.X;
            var dy = p.Y - OwnedForms[0].Location.Y;
            foreach (var f in OwnedForms)
                f.Location= new Point(f.Location.X+dx, f.Location.Y+dy);
        }
    }
    Form CreateForm(double opacity, Point location, Size size)
    {
        var f = new Form();
        f.FormBorderStyle = FormBorderStyle.None;
        f.BackColor = Color.Lime;
        f.Opacity = opacity;
        f.StartPosition = FormStartPosition.Manual;
        f.DesktopLocation = PointToScreen(location);
        f.ClientSize = size;
        f.Owner = this;
        f.ShowInTaskbar = false;
        return f;
    }
}

Windows Forms - Многослойные Windows

В качестве опции вы можете использовать Многослойные окна .

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

enter image description here

public partial class MyLayeredForm : PerPixelAlphaForm
{
    public MyLayeredForm()
    {
        InitializeComponent();
        var bm = new Bitmap(230, 230);
        using (var g = Graphics.FromImage(bm))
        {
            using (var b = new SolidBrush(Color.FromArgb(255, Color.Lime)))
                g.FillRectangle(b, 10, 10, 100, 100);
            using (var b = new SolidBrush(Color.FromArgb(255 * 75 / 100, Color.Lime)))
                g.FillRectangle(b, 120, 10, 100, 100);
            using (var b = new SolidBrush(Color.FromArgb(255 * 50 / 100, Color.Lime)))
                g.FillRectangle(b, 10, 120, 100, 100);
            using (var b = new SolidBrush(Color.FromArgb(255 * 25 / 100, Color.Lime)))
                g.FillRectangle(b, 120, 120, 100, 100);
        }
        this.SelectBitmap(bm);
    }
}

WPF - прозрачная форма и элементы управления с непрозрачностью

Лучшей платформой для удовлетворения такого требования пользовательского интерфейса является WPF.

Для этого вы можете установить Background окнана Transparent и WindowStyle на None и установите AllowTransparency на True.Также для каждого элемента управления вы можете просто установить значение Opacity:

enter image description here

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="261.154" Width="232.923" 
        Background="Transparent" AllowsTransparency="True" 
        WindowStyle="None" WindowStartupLocation="CenterScreen">
    <Grid Margin="0,0,0,0">
        <Grid HorizontalAlignment="Left" Height="100" 
              Margin="10,10,0,0" VerticalAlignment="Top" 
              Width="100" Background="Lime" Opacity="1"/>
        <Grid HorizontalAlignment="Left" Height="100"
              Margin="120,10,0,0" VerticalAlignment="Top"
              Width="100" Background="Lime" Opacity="0.75" 
              Grid.ColumnSpan="2"/>
        <Grid HorizontalAlignment="Left" Height="100"
              Margin="10,120,0,0" VerticalAlignment="Top"
              Width="100" Background="Lime" Opacity="0.50"/>
        <Grid HorizontalAlignment="Left" Height="100"
              Margin="120,120,0,0" VerticalAlignment="Top"
              Width="100" Background="Lime" Opacity="0.25"
              Grid.ColumnSpan="2"/>
    </Grid>
</Window>
0 голосов
/ 24 июня 2018
Панель

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

Imports System.ComponentModel

Partial Public Class C_PANEL
Inherits Panel
Private Const WS_EX_TRANSPARENT As Integer = &H20

Public Sub NewP()
    SetStyle(ControlStyles.Opaque, True)
End Sub

Public Sub NewP(con As IContainer)
    con.Add(Me)
End Sub

Private iopacity As Integer = 50
<DefaultValue(50)>

Public Property Opacity() As Integer
    Get
        Return Me.iopacity
    End Get

    Set(value As Integer)
        If Value < 0 OrElse Value > 100 Then
            Throw New ArgumentException("value must be between 0 and 100")
        End If
        Me.iopacity = Value
    End Set
End Property

Protected Overrides ReadOnly Property CreateParams() _
          As CreateParams
    Get
        Dim cpar As CreateParams = MyBase.CreateParams
        cpar.ExStyle = cpar.ExStyle Or WS_EX_TRANSPARENT
        Return cpar
    End Get
End Property

Protected Overrides Sub OnPaint(e As PaintEventArgs)
    Using brush = New SolidBrush(Color.FromArgb(Me.Opacity _
          * 255 / 100, Me.BackColor))
        e.Graphics.FillRectangle(brush, Me.ClientRectangle)
    End Using
    MyBase.OnPaint(e)
End Sub

End Class

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

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

...