11

我想制作一个透明但保留“正常”边框、关闭按钮、最小化和最大化按钮的简单应用程序。

我知道如何使用标准使窗口透明

<Window
    WindowStyle="None"
    AllowsTransparency="True"
    Background="Transparent">
</Window>

但这会删除边框和右上角的按钮。我读了这个线程,

带边框的透明窗口

哪种给出了解决方案,但实际上,如果我不使窗口透明,我只想能够保持标准边框。我可以移动窗口、调整大小、关闭等的方法......这可能吗?

4

2 回答 2

6

我根据 Microsoft.com 上的本教程组织了一个快速TransparencyConverter课程,您可以将其用于此目的:

using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;

namespace WpfApplication2
{
    class TransparencyConverter
    {
        private readonly Window _window;

        public TransparencyConverter(Window window)
        {
            _window = window;
        }

        public void MakeTransparent()
        {
            var mainWindowPtr = new WindowInteropHelper(_window).Handle;
            var mainWindowSrc = HwndSource.FromHwnd(mainWindowPtr);
            if (mainWindowSrc != null)
                if (mainWindowSrc.CompositionTarget != null)
                    mainWindowSrc.CompositionTarget.BackgroundColor = System.Windows.Media.Color.FromArgb(0, 0, 0, 0);

            var margins = new Margins
            {
                cxLeftWidth = 0,
                cxRightWidth = Convert.ToInt32(_window.Width) * Convert.ToInt32(_window.Width),
                cyTopHeight = 0,
                cyBottomHeight = Convert.ToInt32(_window.Height) * Convert.ToInt32(_window.Height)
            };

            if (mainWindowSrc != null) DwmExtendFrameIntoClientArea(mainWindowSrc.Handle, ref margins);
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct Margins
        {
            public int cxLeftWidth;
            public int cxRightWidth;
            public int cyTopHeight;
            public int cyBottomHeight;
        }

        [DllImport("DwmApi.dll")]
        public static extern int DwmExtendFrameIntoClientArea(IntPtr hwnd, ref Margins pMarInset);
    }
}

完成后,将透明背景属性添加到 XAML 并订阅 Window_Loaded 事件并调用 MakeTransparent 方法:

<Window etc etc Background="Transparent" Loaded="Window_Loaded">

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    var transparencyConverter = new TransparencyConverter(this);
    transparencyConverter.MakeTransparent();
}

截图如下:

截屏

于 2013-06-04T21:41:41.703 回答
1

我将首先查看背景颜色的 rgb(a) 颜色中的 (a)lpha 设置。alpha 设置设置对象颜色的不透明度。

虽然,我注意到当我发布这个时,我之前的另一个帖子看起来更简洁,可能更适合你。

于 2013-06-04T22:00:57.207 回答