Member 12684760 Ответов: 3

Как я могу сделать свою форму похожей на эффект размытия windows 10 VB.NET


черт возьми, извините за мой плохой английский.
я пытаюсь создать дизайн, в котором он похож на эффект размытия прозрачности в windows 10, а также на уведомление о windows 10.
я использую vb.net и я тоже новичок в программировании ,может кто-нибудь мне помочь?
заранее спасибо

Что я уже пробовал:

я еще ничего не пробовал, потому что понятия не имею, с чего начать.
Dim imagebitmap As Bitmap
    Dim graphicsvariable As Graphics

    Sub BlurrMe(frm As Form)
        Dim b As Bitmap = getscreenshot(WorkArea) 'get the screen shot'
        BlurBitmap(b) 'blur the screen shot'
        frm.BackgroundImage = b 'set the picturebox image as b (the blurred image)'
    End Sub

    Public Function getscreenshot(frm As Form)
        imagebitmap = New Bitmap(frm.Size.Width, frm.Size.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb) 'creates a new blank bitmap having size of the form'
        graphicsvariable = Graphics.FromImage(imagebitmap)      'creates a      picture template that enables the graphics variable to draw on'
        graphicsvariable.CopyFromScreen(0, 0, 0, 0, frm.Size, CopyPixelOperation.SourceCopy)    'copies graphics that is on the screen to the imagebitmap'
        Return imagebitmap
    End Function

    Sub BlurBitmap(ByRef image As Bitmap, Optional ByVal BlurForce As Integer = 2)
        Dim g As Graphics = Graphics.FromImage(image)  'We get a graphics object from the image'
        Dim att As New ImageAttributes  'declare an ImageAttributes to use it when drawing'
        Dim m As New ColorMatrix  'declare a ColorMatrix'
        m.Matrix33 = 0.4 ' set Matrix33 to 0.5, which represents the opacity. so the drawing will be semi-trasparent.
        att.SetColorMatrix(m)   'Setting this ColorMatrix to the ImageAttributes.'
        For x = -1 To BlurForce  'drawing the image on it self, but not in the same coordinates, in a way that every pixel will be drawn on the pixels arround it.'
            For y = -1 To BlurForce
                g.DrawImage(image, New Rectangle(x, y, image.Width, image.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, att) 'Drawing image on it self using out ImageAttributes to draw it semi-transparent.'
            Next
        Next
        'disposing ImageAttributes and Graphics. the effect is then applied. '
        att.Dispose() : g.Dispose() 'dispose g'
    End Sub

Ralf Meier

Было бы полезно, если бы у вас был пример, который показывает, что именно вы хотите иметь.
Какой контроль должен получить прозрачность ?

Ralf Meier

Если вы хотите иметь это только для формы, вы можете использовать свойство Opacity из формы ...

Member 12684760

этот код пришел для решения, которое прислал Ральф Мейер.
Я называю свою основную форму workarea .
тогда мое фоновое имя формы было msgback.
на моей базовой загрузке msgback
назовите суб-код как Blurrme (me)

Graeme_Grant

Выложил лучшее решение... :)

3 Ответов

Рейтинг:
28

Graeme_Grant

В этом поиске Google есть множество примеров того, как это сделать: прозрачность стекла winform win10[^]


Ralf Meier

Для меня в этом ответе нет ничего плохого-поэтому я проголосовал за него ...
+5 от меня

Graeme_Grant

спасибо. :) Я думаю, что он хотел, чтобы я сделал код для него...

Ralf Meier

;- ) Я тоже догадался ...

Graeme_Grant

Если они дадут такой отрицательный отзыв тем, кто пытается указать им правильное направление, то никто не захочет им помочь.

Они просто не понимают как недружелюбный &усилитель; враждебный это заставляет их появляться...

Member 12684760

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

То, что я имел в виду здесь, заключается в том, что я хотел бы сделать окно сообщения, которое находится на backgroud id, чтобы размыть его .
что вполне вероятно, опять же, что я буду называть его каждый раз, когда я сделал messagebox. если вы снова попросите о помощи, чтобы вы сделали это немного быстрее, спасибо за вашу помощь, особенно Ральфу Мейеру .

Рейтинг:
16

Graeme_Grant

У меня есть рабочее решение для windows 10 (взято из решения WPF):

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WFWindows
{
    public partial class BlurForm : Form
    {
        public BlurForm()
        {
            this.EnableBlur();
            SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            BackColor = Color.LimeGreen;
            TransparencyKey = Color.LimeGreen;
            InitializeComponent();
            FormBorderStyle = FormBorderStyle.None;
        }
    }

    public static class WindowExtension
    {
        [DllImport("user32.dll")]
        static internal extern int SetWindowCompositionAttribute(IntPtr hwnd, ref WindowCompositionAttributeData data);

        public static void EnableBlur(this Form @this)
        {
            var accent = new AccentPolicy();
            accent.AccentState = AccentState.ACCENT_ENABLE_BLURBEHIND;
            var accentStructSize = Marshal.SizeOf(accent);
            var accentPtr = Marshal.AllocHGlobal(accentStructSize);
            Marshal.StructureToPtr(accent, accentPtr, false);
            var Data = new WindowCompositionAttributeData();
            Data.Attribute = WindowCompositionAttribute.WCA_ACCENT_POLICY;
            Data.SizeOfData = accentStructSize;
            Data.Data = accentPtr;
            SetWindowCompositionAttribute(@this.Handle, ref Data);
            Marshal.FreeHGlobal(accentPtr);
        }

    }
    enum AccentState
    {
        ACCENT_DISABLED = 0,
        ACCENT_ENABLE_GRADIENT = 1,
        ACCENT_ENABLE_TRANSPARENTGRADIENT = 2,
        ACCENT_ENABLE_BLURBEHIND = 3,
        ACCENT_INVALID_STATE = 4
    }

    struct AccentPolicy
    {
        public AccentState AccentState;
        public int AccentFlags;
        public int GradientColor;
        public int AnimationId;
    }

    struct WindowCompositionAttributeData
    {
        public WindowCompositionAttribute Attribute;
        public IntPtr Data;
        public int SizeOfData;
    }

    enum WindowCompositionAttribute
    {
        WCA_ACCENT_POLICY = 19
    }
}


Рейтинг:
11

Member 12684760

-- перешел к вопросу как не допустимому решению, а расширению исходного вопроса --