C#实现悬浮窗口的方法详解
作者:钢铁男儿 发布时间:2022-06-15 12:29:29
标签:C#,悬浮,窗口
一 悬浮窗口
特点:
① 窗口一般较小,有时为不规则背景;
② 置顶显示;
③ 窗口支持拖动;
④ 一般用于程序状态显示,比如显示下载进度;
⑤ 一般支持右键菜单、拖拽操作等;
二 创建悬浮窗口
1 实现细节
① 无边框FormBorderStyle:Noe;
② 置顶显示TopMost:true;
③ 显示位置StartPosition:Manual自由指定;
2 细节
对应Form来说先Show,后设置大小和位置
floatBox=new myFloatBox();
floatBox.Owner=this;
floatBox.Show();
floatBox.Bounds=new Rectangle(0,0,100,100);
三 圆形背景
代码实现:
① 添加一个正方形的图片资源;
② 绘制圆形图片;
③ 将外围白色区域设为透明;
④ 绘制一个蒙版,确保中间区域没有白色像素点;
子窗体
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 圆形背景
{
public partial class FloatingWindow : Form
{
private Image image;
public FloatingWindow()
{
this.FormBorderStyle = FormBorderStyle.None;//无边框
this.StartPosition = FormStartPosition.Manual;//手工指定位置
this.ShowInTaskbar = false;//在任务栏不显示图标
this.TopMost = true;//置顶显示
this.BackColor = Color.White;//背景色
this.TransparencyKey = Color.White;//指定透明区域的颜色
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
int w = this.Width, h = this.Height;
Rectangle rect = new Rectangle(0, 0, w, h);
rect.Inflate(-2, -2);
//平滑绘制,反锯齿
g.SmoothingMode = SmoothingMode.HighQuality;
g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
//绘制一个圆形的图片
if(true)
{
GraphicsPath path = new GraphicsPath();
int radius = rect.Width / 2;
int x = w / 2 - radius;
int y = h / 2 - radius;
path.AddEllipse(new Rectangle(x, y, radius * 2, radius * 2));
//设置剪辑区域
Region oldClip = g.Clip;
g.Clip = new Region(path);
//绘制图像(Clip区域之外的部分不会显示)
if(this.image!=null)
{
Console.WriteLine("图像:" + image.Size);
Console.WriteLine("位置" + this.Size);
g.DrawImage(image, rect);
}
//覆盖一层蒙版,确保纯白色像素点不会出现,因为纯白色是透明色
Brush brush = new SolidBrush(Color.FromArgb(10, 255, 255, 255));
g.FillRectangle(brush, rect);
brush.Dispose();
g.Clip.Dispose();
g.Clip = oldClip;//恢复
Pen pen = new Pen(Color.LightBlue);
g.DrawPath(pen, path);
pen.Dispose();
}
}
public Image Image
{
get { return this.image; }
set { this.image = value;
this.Invalidate();
}
}
}
}
父窗体
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 圆形背景
{
public partial class Form1 : Form
{
FloatingWindow floatingWindow;
public Form1()
{
InitializeComponent();
floatingWindow=new FloatingWindow();
floatingWindow.Show();
floatingWindow.Bounds = new Rectangle(0, 0, 100, 100);
//设置悬浮窗口的背景图片
floatingWindow.Image = Properties.Resources.XiaoWu;
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
floatingWindow.Dispose();
}
}
}
来源:https://blog.csdn.net/weixin_42291376/article/details/128174879


猜你喜欢
- 小编对微信开发颇感兴趣,查阅了网上相关文章进行整理,方便大家一起学习。1、注册帐号--填写服务器配置在https://mp.weixin.q
- Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法:首
- package com.chen.lucene.image;import java.io.File;import java.io.FileI
- Java异常层次结构Exception异常RuntimeException与非RuntimeException异常的区别:非RuntimeE
- 百度了许多相关资料,对两种修改app图标的方式进行总结:第一种:(最简单的方法)将你准备好的 图标放入res目录下的drawable,在An
- 累加数累加数 是一个字符串,组成它的数字可以形成累加序列。一个有效的 累加序列 必须 至少 包含 3 个数。除了最开始的两个数以外,序列中的
- 闲话不多说,直接上图。给大家讲讲我的编程思想吧。第一部分:沉浸式状态栏(API-Level 19, Android4.4 KitKat 之后
- 文章来源:csdn 作者:wangfengsdu经常听到回调函数(callback function)这个概念, 所谓回调函数,就是指这个函
- 目录文件下载文件上传 * * 的配置多个 * 的执行顺序异常处理器基于配置的异常处理基于注解的异常处理总结文件下载使用ResponseEn
- 问题描述:idea输入中文,没输入几个拼音就好像自动回车,有时得到几个字母,然后就不能输入拼音了。遇到这个情况就导致输入中文特别困难,可以采
- 原理分析:迅雷的thunder://地址就是将普通url地址加前缀‘AA'、后缀‘ZZ',再base64编码后得到的字符串实
- Java 8中引入了CompletableFuture类,它是一种方便的异步编程工具,可以处理各种异步操作,如网络请求、文件IO和数据库操作
- 我们在日常开发时会经常遇到将一个字符串按照指定的字符进行分割。这时,我们往往会想到使用str.split(","),进行
- 基于IDEA生成可执行jar包1.编写class的代码,注意一定要有main()方法才可以生成jar包,main()方法可以没有内容。例如:
- 一、准备java我已经把java装到了在D盘:二、配置java环境变量点击设置,进入windows设置页面;搜索高级系统设置:在系统变量里添
- 一、常规形式1 项目结构2 配置文件及环境设置(1)配置文件# 应用服务 WEB 访问端口server.port=8080# spring
- 1.项目简绍本项目使用SpringBoot开发,jdbc5.1.48 Mybatis 源码可下载其中涉及功能有:Mybatis的使用,Thy
- java解决动态配置字段需求是否在开发中遇到有像下图一样管理员配置多个字段让用户填写的需求我的实现方式是通过数据库存储动态json的显示实现
- 一个应用场景,浏览器上传一个文件,此文件后台调用文件转换,需要耗费相当长的时间,这样,如果是一个线程同步式的做下去,那么用户在浏览器上感觉就
- 写应用程序的过程中,弹窗是个避免不了的功能,显示中,假设弹窗背景色和主窗口背景色相差不多,甚至是一样的时候,就会存在一个比较严重的人机交互和