• WPF实现不规则窗体(C#)


    见到一些游戏的客户端窗口,形状是不规则的,一直觉得很炫。就想用winform做一个玩下,思路就是:去掉标题栏,用一张透明背景色的图片作为Form的背景。可是在实现的过程中我却悲愤的发现,winform的控件是支持透明背景色的,但是Form本身却不支持。后来看到一篇文章,貌似窗体的TransparencyKey属性(设置窗体将显示为透明的颜色)可以化解我的悲愤。原来我的思路是错的,真惭愧!但是这种方法在24位色以上的环境下也不能实现效果,为了解决这个问题,后面的代码可谓是贼长贼长的,看得我都不乐意了。更倒胃口的是,那代码居然还是截图的,想复制都没戏。咱可是个懒人,哪愿意写那么多啊!。 

      最后听说WPF做不规则窗体是相当简单的,正好自己也一直想了解WPF到底是个啥么玩意,于是就欣欣然动手做起来。嘿,还果不其然!! 
    具体步骤:
    1、让窗体支持透明,AllowsTransparency="True";
    2、去掉标题栏,WindowStyle="None";
       注:当 AllowsTransparency 为 True 时,WindowStyle.None 是 WindowStyle 的唯一有效值。
    3、设置背景为透明色,Background="Transparent";
    4、用一张不规则的图片作为Grid元素的背景。
    运行就能看到效果啦!
    前台Xaml代码:
        <Window x:Class="WPF_CS.Window_xyy"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="WPF不规则窗体" AllowsTransparency="True" WindowStyle="None"Background="Transparent" MouseLeftButtonDown="Window_MouseLeftButtonDown">
            <Grid Height="520" Width="520">
                <Image Source="/Wpf_CS;component/Images/xyy.png">
                    <Image.BitmapEffect>
                        <OuterGlowBitmapEffect GlowColor="White" GlowSize="2" />
                    </Image.BitmapEffect>
                </Image>
                <TextBlock Height="16" HorizontalAlignment="Left" Margin="90,430,0,0"Text="--2010年9月7日" FontSize="13" />
                <Button Width="50" Height="30" Background="#ADFF2F"HorizontalAlignment="Right" Margin="0,420,60,0" Click="btnClose_Click"FocusVisualStyle="{x:Null}">关 闭</Button>
            </Grid>
        </Window>
        OuterGlowBitmapEffect效果:围绕对象或颜色区域创建颜色光环;
        点击按钮时,会出现一个虚线边框,加上FocusVisualStyle="{x:Null}"可以去掉这个边框。
    后台C#代码:
        /// <summary>
        /// 拖拽窗体
        /// </summary>
        private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)

        {
            this.DragMove();
        }
        /// <summary>
        /// 关闭窗体
        /// </summary>
        private void btnClose_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
             Application.Current.Shutdown();
        }

    窗体的拖动:
    因为没有标题栏,窗体变得无法拖动了。记得在winform里面,是利用windows API函数和windows的消息机制解决的,顺便也记录进来: 
    //声明API函数和消息

    [DllImport("user32.dll")]
    public static extern bool ReleaseCapture();
    [DllImport("user32.dll")]
    public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
    public const int WM_SYSCOMMAND = 0x0112;
    public const int SC_MOVE = 0xF010;
    public const int HTCAPTION = 0x0002;

    /// <summary>
    /// 实现窗体可拖动
    /// </summary>
    public void DragForm(IntPtr handle)
    {
        ReleaseCapture();
        SendMessage(handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
    }
    //然后在相关控件的MouseDown事件中加入:
       DragForm(this.Handle); 
    而WPF提供了DragMove方法,在相应控件的MouseLeftButtonDown事件函数中调用即可实现。
    效果图:

    图片

  • 相关阅读:
    python 进程
    python 网络编程
    Tensorflow学习教程------参数保存和提取重利用
    Tensorflow学习教程------利用卷积神经网络对mnist数据集进行分类_利用训练好的模型进行分类
    Tensorflow学习教程------利用卷积神经网络对mnist数据集进行分类_训练模型
    Tensorflow学习教程------tensorboard网络运行和可视化
    Tensorflow学习教程------过拟合
    Spring的@Value注解为静态变量赋值
    Linux使用scp远程拷贝使用ssh免密登录
    Mysql升级5.7.10后GROUP BY语句出错解决方法
  • 原文地址:https://www.cnblogs.com/yanpo/p/2286717.html
Copyright © 2020-2023  润新知