zoukankan      html  css  js  c++  java
  • 玻璃效果

    封装好的帮助类,实现玻璃效果。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Windows;
    using System.Windows.Interop;
    using System.Windows.Media;
    
    namespace Test
    {
        [StructLayout(LayoutKind.Sequential)]
        public struct MARGINS
        {
            public int Left;
            public int Right;
            public int Top;
            public int Bottom;
            public MARGINS(Thickness t)
            {
                Left = (int)t.Left;
                Right = (int)t.Right;
                Top = (int)t.Top;
                Bottom = (int)t.Bottom;
            }
        }
    
        public class GlassHelper
        {
            [DllImport("dwmapi.dll", PreserveSig = false)]
            static extern void DwmExtendFrameIntoClientArea(
                IntPtr hWnd, ref MARGINS pMarInset);
    
            [DllImport("dwmapi.dll", PreserveSig = false)]
            static extern bool DwmIsCompositionEnabled();
    
            public static bool ExtendGlassFrame(Window window, Thickness margin)
            {
                if (!DwmIsCompositionEnabled())
                    return false;
    
                IntPtr hwnd = new WindowInteropHelper(window).Handle;
                if (hwnd == IntPtr.Zero)
                    throw new InvalidOperationException(
                        "The Window must be shown before extending glass");
    
                //Set the backgroud to transparent from both the WPF and Win32 perspectives
                window.Background = Brushes.Transparent;
                HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor = Colors.Transparent;
    
                MARGINS margins = new MARGINS(margin);
                DwmExtendFrameIntoClientArea(hwnd, ref margins);
    
                return true;
            }
        }
    }

    这个方法不仅必须在初始化的时候调用,也必须在禁用或者重新启用桌面合成之后调用。用户操作或者由远程桌面这样的东西触发,都可能导致禁用或者重新启用桌面合成。为了能收到桌面合成事件,你需要截获一条Win32消息(WM_DWMCOMPOSITIONCHANGED)。

    调用方法如下

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Interop;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace Test_7_3_2
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            private const int WM_DWMCOMPOSITIONCHANGED = 0x031E;
            public MainWindow()
            {
                InitializeComponent();
            }
    
            protected override void OnSourceInitialized(EventArgs e)
            {
                base.OnSourceInitialized(e);
    
                //This can't be done any earlier than the SourceInitialized event
                GlassHelper.ExtendGlassFrame(this, new Thickness(-1));
    
                //Attach a window procedure in order to detect later enabling of desktop composition
                IntPtr hwnd = new WindowInteropHelper(this).Handle;
                HwndSource.FromHwnd(hwnd).AddHook(new HwndSourceHook(WndProc));
            }
    
            private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
            {
                if(msg == WM_DWMCOMPOSITIONCHANGED)
                {
                    //Reenable glass
                    GlassHelper.ExtendGlassFrame(this, new Thickness(-1));
                    handled = true;
                }
                return IntPtr.Zero;
            }
        }
    }
  • 相关阅读:
    Android开发笔记记住用户名密码(SharedPreferences)
    Android 开发笔记——全局变量
    linker command failed with exit code 1 (use v to see invocation)
    cocos2diphone搭建开发环境。
    google 打不开?
    iOS 局部变量 setTag后可在别的地方调用 viewWithTag
    _OBJC_CLASS_$_SKStoreProductViewController
    iOS 合并.a文件,制作通用静态库
    NSUserDefaults 数据的存取
    xcode 4 制作静态库详解 [转]
  • 原文地址:https://www.cnblogs.com/baiqjh/p/3876651.html
Copyright © 2011-2022 走看看