当前位置:   article > 正文

C# Winform 窗体美化(六、双层窗体)_winform updatelayeredwindow

winform updatelayeredwindow

六、双层窗体

大概情况

双层床体是为了平滑的创建异形窗体的一个解决方案,找了很多资料,整理了一下。

双层窗体的逻辑是建立在 UpdateLayeredWindow 不能绘制控件的基础上,上层再添加一个专门放置控件的层;这样就可以在上层“控件层”放控件,下层的“皮肤层”绘制异形的窗口。

有两点需要主意:

  1. 两个窗体的大小和位置的统一,使用 Size 和 Location 来解决;
  2. 两个窗体的 Z 轴(层次顺序)要准确,使用 Form.Owner 即可解决。
代码

源码下载
如果没有积分,也可以关注我获取哟~
hi
控件层代码:

public partial class MainForm : Form
{
    private SkinForm Skin;
    public MainForm()
    {
        InitializeComponent();
        ShowInTaskbar = false;//禁止控件层显示到任务栏
        FormBorderStyle = FormBorderStyle.None;//设置无边框的窗口样式
    }
    private void MainForm_Load(object sender, EventArgs e)
    {
        if (!DesignMode)
        {
            Skin = new SkinForm(this);//创建皮肤层 
            BackgroundImage = null;//去除控件层背景
            TransparencyKey = BackColor;//使控件层背景透明
            Skin.Show();//显示皮肤层 
        }
    }

    #region 属性
    private bool _skinmobile = true;
    [Category("Skin")]
    [Description("窗体是否可以移动")]
    [DefaultValue(typeof(bool), "true")]
    public bool SkinMovable
    {
        get { return _skinmobile; }
        set
        {
            if (_skinmobile != value)
            {
                _skinmobile = value;
            }
        }
    }
    #endregion
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

皮肤层代码:

partial class SkinForm : Form
{
    private MainForm Main;
    public SkinForm(MainForm main)
    {
        InitializeComponent();
        SetStyles();//减少闪烁
        Main = main;//获取控件层对象
        FormBorderStyle = FormBorderStyle.None;//设置无边框的窗口样式
        ShowInTaskbar = true;//使控件层显示到任务栏
        BackgroundImage = Main.BackgroundImage;//将控件层背景图应用到皮肤层
        BackgroundImageLayout = ImageLayout.Stretch;//自动拉伸背景图以适应窗口
        Size = Main.Size;//统一大小
        Main.Owner = this;//设置控件层的拥有皮肤层
        FormMovableEvent();//激活皮肤层窗体移动
        SetBits();//绘制半透明不规则皮肤
        Location = new Point(Main.Location.X, Main.Location.Y);//统一控件层和皮肤层的位置
    }
    //减少闪烁代码...(见源码)
    //激活皮肤层窗体移动代码...(见源码)
    //绘制半透明不规则皮肤代码...(见源码)
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
效果图

正八经的效果图

参考资料

双层窗体 csdn bbs http://bbs.csdn.net/topics/390769541
双层窗体源码 http://download.csdn.net/download/lyx_520/4921128

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/137865
推荐阅读
相关标签
  

闽ICP备14008679号