基于.Net Core实现自定义皮肤WidForm窗口

news/2024/5/19 22:25:52 标签: .netcore, 自定义皮肤, c#, github

前言

今天一起来实现基于.Net Core、Windows Form实现自定义窗口皮肤,并实现窗口移动功能。

素材

准备素材:边框、标题栏、关闭按钮图标。

在这里插入图片描述

窗体设计

1、创建Window窗体项目

在这里插入图片描述

在这里插入图片描述

2、窗体设计

拖拉4个Panel控件,分别用于:标题栏、关闭按钮、窗体、底部边框。
在这里插入图片描述

3、添加图片到资源

右键项目=》属性=》资源=》创建资源
在这里插入图片描述

点击添加资源=》添加现有文件。
在这里插入图片描述

4、设置控件背景图片

选择对应的Panel控件,分别设置标题栏、窗体、底部、关闭按钮。

在这里插入图片描述
在这里插入图片描述

5、效果

此时运行项目,窗体效果如下:

在这里插入图片描述

窗体事件

窗口的皮肤已经自定义完毕,下面我们为窗口添加事件:关闭和移动。

1、关闭窗口

为关闭按钮,添加关闭事件,按钮如下。

private void panel1_Click(object sender, EventArgs e)
{
    this.Close();
}

2、窗口移动代码

public void FrmMove(Form Frm, MouseEventArgs e)  //Form或MouseEventArgs添加命名空间using System.Windows.Forms;
        {
            if (e.Button == MouseButtons.Left)
            {
                Point myPosittion = Control.MousePosition;//获取当前鼠标的屏幕坐标
                myPosittion.Offset(CPoint.X, CPoint.Y);//重载当前鼠标的位置
                Frm.DesktopLocation = myPosittion;//设置当前窗体在屏幕上的位置
                Tem_place = 0;
                this.Height = FrmHeight;
            }
        }
private void timer1_Tick(object sender, EventArgs e)
        {
            if (this.Top < 3 && Tem_place==0)//如果窗体被移到屏幕的顶部
                {
                    if (this.Handle == FormNameAt(Cursor.Position.X, Cursor.Position.Y))//当鼠标移致到该窗体上
                    {
                        panel_Title.Tag = 1;//设置标识,用于判断窗体在屏幕顶部
                        timer2.Enabled = false;//不对窗体进行拉伸操作
                        this.Top = 0;//使窗体致顶
                    }
                    else
                    {
                        panel_Title.Tag = 1;//设置标识,用于判断窗体在屏幕顶部
                        timer2.Enabled = true;//将窗体在顶部进行隐藏
                    }
                }
                else
                {
                    if (this.Left < 3 || this.Right > GetSystemMetrics(0) - 3)//如果窗体被移到屏幕的左端或右端
                    {
                        if (this.Left < 3)//如果窗体被移到屏幕的左端
                        {
                            if (this.Handle == FormNameAt(Cursor.Position.X, Cursor.Position.Y))//当鼠标移致到该窗体上
                            {
                                panel_Title.Tag = 2;//设置标识,用于判断窗体在屏幕左端
                                timer2.Enabled = false;
                                Frm_Height = this.Height;
                                this.Left = 0;//使窗体致左
                                this.Top = 0;
                                this.Height = Screen.AllScreens[0].Bounds.Height;
                                Tem_place = 1;
                            }
                            else
                            {
                                panel_Title.Tag = 2;
                                timer2.Enabled = true;//将窗体在左端进行隐藏
                            }
                        }
                        if (this.Right > GetSystemMetrics(0) - 3)//如果窗体被移到屏幕的右端
                        {
                            if (this.Handle == FormNameAt(Cursor.Position.X, Cursor.Position.Y))//当鼠标移致到该窗体上
                            {
                                panel_Title.Tag = 3;//设置标识,用于判断窗体在屏幕右端
                                timer2.Enabled = false;
                                Frm_Height = this.Height;
                                this.Left = GetSystemMetrics(0) - this.Width;//使窗体致右
                                this.Top = 0;
                                this.Height = Screen.AllScreens[0].Bounds.Height;
                                Tem_place = 1;
                            }
                            else
                            {
                                panel_Title.Tag = 3;
                                timer2.Enabled = true;//将窗体在右端进行隐藏
                            }
                        }

                    }
                }

        }

好了,今天就分享到这边,需要示例代码的获取👇🏻。

欢迎点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻


http://www.niftyadmin.cn/n/5057610.html

相关文章

算法练习3——删除有序数组中的重复项

LeetCode 26 删除有序数组中的重复项 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums …

聊一聊国内大模型公司,大模型面试心得、经验、感受

有着过硬的技术却无处可用是不是很苦恼呢&#xff0c;大家在面试时是不是也积累了一些经验呢&#xff0c;本文详细总结了大佬在大模型面试时的一些经验及感悟&#xff0c;希望对大家面试找工作有所帮助。 2023年&#xff0c;大模型突然国内火了起来&#xff0c;笔者就面了一些…

No147.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

算法练习5——多数元素

LeetCode 多数元素 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 蛮力法 双重循环&#xff0c;不过会超时 class Solution:de…

What is a TCP SYN Flood DDoS Attack?

什么是TCP SYN洪水攻击&#xff1f; 传输控制协议 &#xff08;TCP&#xff09; 在发送方和接收方之间使用三向握手在它们之间建立可靠的 TCP 连接。 首先&#xff0c;想要与接收方建立连接的发送方使用同步序列号 &#xff08;SYN&#xff09; 向接收方发送数据段&#xff0c…

brew 安装MySQL 5.7

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

窗口类介绍

目录 Qwidget QDialog QMessageBox QFileDialog QFontDialog QColorDialog QInputDialog QProgressDialog QMainWindow 菜单栏 工具栏 状态栏 停靠窗口 窗口布局 Qwidget 常用的一些函数包括&#xff1a; 设置窗口的大小&#xff0c;尺寸&#xff0c;得到对应的…

用于时间触发的嵌入式软件的IDE

TTE Systems的RapidiTTy IDE为希望创建“时间触发”微控制器软件以提高整体系统可靠性的开发人员提供了一个独立的环境。RapidiTTy&#xff08;下面的图1&#xff09;旨在解决深度嵌入的应用&#xff0c;包括医疗&#xff0c;国防&#xff0c;汽车和工业部门以及白色和棕色商品…