Powershell实现圆缩小放大 (实时刷新窗口)
使用Powershell,创建实时刷新的窗口,绘制图形,这里以圆作为例子,做缩小放大动画。
【分析】
Powershell是windows内置的自动部署平台,功能强大在于可以调取.net框架,因此,即使没有Opengl加持,也可以创建实时刷新的窗口。可以调用windows.Form程序集创建窗口,然后调用System.Drawing程序集来绘制。graphics.FillEllipse可以绘制实心圆,graphics.DrawEllipse可以绘制空心圆。对于实时刷新画面,可以设置一个定时器,例如每过16.7毫秒触发一次绘制,即每秒60帧画面刷新率。每次刷新绘制,圆的大小参数修改并重新绘制。
【实现】
1. 绘制空心圆动画
# 加载 System.Drawing 和 System.Windows.Forms 程序集
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName System.Windows.Forms
# 创建一个新的窗体
$form = New-Object System.Windows.Forms.Form
$form.Text = "圆放大缩小循环动画"
# 设置窗体大小为 1000x800
$form.Size = New-Object System.Drawing.Size(1000, 800)
$form.StartPosition = "CenterScreen"
# 设置背景颜色为黑色
$form.BackColor = [System.Drawing.Color]::Black
# 启用双缓冲以减少闪烁
$doubleBufferProperty = $form.GetType().GetProperty("DoubleBuffered", [System.Reflection.BindingFlags]::NonPublic -bor [System.Reflection.BindingFlags]::Instance)
$doubleBufferProperty.SetValue($form, $true, $null)
# 定义圆的初始半径
$radius = 10
# 定义最大半径和最小半径
$maxRadius = [int]([Math]::Min($form.ClientSize.Width, $form.ClientSize.Height) / 2)
$minRadius = 10
# 定义一个标志,用于判断圆是在放大还是缩小
$isGrowing = $true
# 定义一个定时器
$timer = New-Object System.Windows.Forms.Timer
$timer.Interval = 16.7 # 每 16.7 毫秒触发一次
# 定时器的 Tick 事件处理程序
$timer.Add_Tick({
param($sender, $e)
if ($isGrowing) {
# 圆正在放大
$script:radius += 1
if ($script:radius -ge $maxRadius) {
# 达到最大半径,开始缩小
$script:isGrowing = $false
}
} else {
# 圆正在缩小
$script:radius -= 1
if ($script:radius -le $minRadius) {
# 达到最小半径,开始放大
$script:isGrowing = $true
}
}
# 使窗体无效,触发重绘事件
$form.Invalidate()
})
# 窗体大小改变事件处理程序,确保圆心始终在窗口中心
$form.Add_SizeChanged({
$script:maxRadius = [int]([Math]::Min($form.ClientSize.Width, $form.ClientSize.Height) / 2)
$form.Invalidate()
})
# 窗体的 Paint 事件处理程序
$form.Add_Paint({
param($sender, $e)
$graphics = $e.Graphics
# 设置画笔颜色和宽度,将边框设置更粗
$pen = New-Object System.Drawing.Pen([System.Drawing.Color]::Red, 5)
# 计算窗口中心位置作为圆心
$centerX = [int]($form.ClientSize.Width / 2)
$centerY = [int]($form.ClientSize.Height / 2)
# 计算圆的矩形边界
$x = $centerX - $radius
$y = $centerY - $radius
$width = $radius * 2
$height = $radius * 2
# 绘制圆
$graphics.DrawEllipse($pen, $x, $y, $width, $height)
# 释放画笔资源
$pen.Dispose()
})
# 启动定时器
$timer.Start()
# 显示窗体
$form.ShowDialog()
2.绘制实心圆动画
# 加载 System.Drawing 和 System.Windows.Forms 程序集
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName System.Windows.Forms
# 创建一个新的窗体
$form = New-Object System.Windows.Forms.Form
$form.Text = "圆放大缩小循环动画"
# 设置窗体大小为 1000x800
$form.Size = New-Object System.Drawing.Size(1000, 800)
$form.StartPosition = "CenterScreen"
# 设置背景颜色为黑色
$form.BackColor = [System.Drawing.Color]::Black
# 通过反射启用双缓冲
$doubleBufferProperty = $form.GetType().GetProperty("DoubleBuffered", [System.Reflection.BindingFlags]::NonPublic -bor [System.Reflection.BindingFlags]::Instance)
$doubleBufferProperty.SetValue($form, $true, $null)
# 定义圆的初始半径和圆心
$centerX = [int]($form.ClientSize.Width / 2)
$centerY = [int]($form.ClientSize.Height / 2)
$radius = 10
# 定义最大半径和最小半径
$maxRadius = [int]([Math]::Min($form.ClientSize.Width, $form.ClientSize.Height) / 2)
$minRadius = 10
# 定义一个标志,用于判断圆是在放大还是缩小
$isGrowing = $true
# 定义一个定时器
$timer = New-Object System.Windows.Forms.Timer
$timer.Interval = 20 # 每 20 毫秒触发一次
# 定时器的 Tick 事件处理程序
$timer.Add_Tick({
param($sender, $e)
if ($isGrowing) {
# 圆正在放大
$script:radius += 1
if ($script:radius -ge $maxRadius) {
# 达到最大半径,开始缩小
$script:isGrowing = $false
}
} else {
# 圆正在缩小
$script:radius -= 1
if ($script:radius -le $minRadius) {
# 达到最小半径,开始放大
$script:isGrowing = $true
}
}
# 使窗体无效,触发重绘事件
$form.Invalidate()
})
# 窗体的 Paint 事件处理程序
$form.Add_Paint({
param($sender, $e)
$graphics = $e.Graphics
# 设置画刷颜色,这里设置为红色
$brush = New-Object System.Drawing.SolidBrush([System.Drawing.Color]::Red)
# 计算圆的矩形边界
$x = $centerX - $radius
$y = $centerY - $radius
$width = $radius * 2
$height = $radius * 2
# 绘制实心圆
$graphics.FillEllipse($brush, $x, $y, $width, $height)
# 释放画刷资源
$brush.Dispose()
})
# 启动定时器
$timer.Start()
# 显示窗体
$form.ShowDialog()
【补充】
1. 调用 System.Drawing 程序集、 System.Windows.Forms 程序集。
2. 设计定时器,每过多少时间重绘一次画面。
3. 设计圆动画逻辑,设置一个开关,圆缩小放大的状态量。并设定圆大小极值。
4. 通过反射启用双缓冲,避免画面闪烁。
【效果】
Powershell实现圆缩小放大 (实时刷新窗口)的更多相关文章
- websocket实现数据库更新时前端页面实时刷新
websocket实现数据库更新时前端页面实时刷新 javaweb 目录(?)[+] userjsp ManagerServletjava 如题,实现以上功能,我知道主要有两大种思路: 轮询:轮询的原 ...
- 使用SignalR实现比特币价格实时刷新
ASP.NET SignalR是微软支持的一个运行在 Dot NET 平台上的 HTML Websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重 ...
- Sublime Text 3配置LiveReload实现实时刷新
今天看到一款很强大的插件,LiveReload,实时刷新,也就是说写完html/css/js等不用再到浏览器里按F5啦,在Ctrl+S时浏览器会自动刷新,是不是想想都很爽... Chrome:(据说支 ...
- Gulp-livereload:实时刷新编码
实现功能 监听指定目录下的所有文件,实时动态刷新页面 安装(Install) 功能的实现是借助 gulp-connect 插件完成的;所以,首先通过下面命令完成插件安装: npm install -- ...
- tab栏切换,内容为不断实时刷新数据的vue实现方法
先说一下产品需求,就是有几个tab栏,每个tab栏对应的ajax请求不一样,内容区域一样,内容为实时刷新数据,每3s需要重新请求,返回的数据在内容区域展示,每点击一次tab栏需停止其他tab栏ajax ...
- webpack-dev-server 搭建本地服务以及浏览器实时刷新
一.概述开发项目中为了保证上线,开发项目是都需要使用localhost进行开发,以前的做法就是本地搭建Apache或者Tomcat服务器.有的前端开发人员 对服务器的搭建和配置并不熟悉,这个时候需要后 ...
- JAVAFX之tableview界面实时刷新导致的内存溢出(自己挖的坑,爬着也要出来啊0.0)
这几天遇到了一个问题,不幸开发的一个cs架构的工具,客户端开启后,内存一直在缓慢增长最终导致进程卡死,花了4天时间,终于爬出来了... 客户端通过timer定时器每30秒查询一次数据库以及一些业务逻辑 ...
- js获取当前时间并实时刷新
效果如图: 代码如下: <html> <head> <title>js获取当前时间并实时刷新</title> <script> //页面加载 ...
- Vue+WebSocket 实现页面实时刷新长连接
最近vue项目要做数据实时刷新,折线图每秒重画一次,数据每0.5秒刷新一次,说白了就是实时刷新,因为数据量较大,用定时器估计页面停留一会就会卡死... 与后台人员讨论过后决定使用h5新增的WebSoc ...
- echarts背景分割区域填充不同颜色(x轴为time),实时刷新
先来看下图片吧,这是实现效果: 思路: 因为要实时刷新,可以使用setInterval(),但是要控制好定时器的起与停,否则容易错乱以及页面卡死: 主要就是利用定时器五秒刷新,重绘echarts图:= ...
随机推荐
- Ubuntu22.04安装cuda12.1+cudnn8.9.2+TensorRT8.6.1+pytorch2.3.0+opencv_cuda4.9+onnxruntime-gpu1.18
说来话长,我想配一个一劳永逸的环境,方便以后复用.省的以后反复查教程重新装了 1. 安装miniconda+py3.10 cd /root wget -q https://repo.anaconda. ...
- 优雅地打印 HEX 数据
转载至知乎Murphy https://zhuanlan.zhihu.com/p/320391096 前言 在调试的时候经常要打印内存里的数据,来看看数据及格式是否在预期范围内:以及在调试二进制协议的 ...
- 渗透测试-前端加密分析之RSA响应加密
本文是高级前端加解密与验签实战的第7篇文章,本系列文章实验靶场为Yakit里自带的Vulinbox靶场,本文讲述的是绕过请求包和响应包加密来爆破登录界面. 分析 这里的公私钥同上文一样是通过服务端获取 ...
- tar 分卷压缩和解压缩
示例将 jdk1.8.0_221 文件夹按 98m 进行分卷压缩和解压缩压缩: tar -czvf - jdk1.8.0_221/ |split -b 98m - jdk1.8.0_221.tar.g ...
- SM国密算法
package com.abc.apollo.common.util; import javax.crypto.IllegalBlockSizeException; import java.secur ...
- Qt/C++摄像头采集/二维码解析/同时采集多路/图片传输/分辨率帧率可调/自动重连
一.前言 本地摄像头的采集可以有多种方式,一般本地摄像头会通过USB的方式连接,在嵌入式上可能大部分是CMOS之类的软带的接口,这些都统称本地摄像头,和网络摄像头最大区别就是一个是通过网络来通信,一个 ...
- 即时通讯技术文集(第7期):长连接网关、P2P等 [共10篇]
为了更好地分类阅读52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第7 期. [- 1 -] 长连接网关技术专题(二):知乎千万级并发的高性能长连接网关技术实践 [ ...
- Scala,一门「特立独行」的语言!
入门 Spark 的路上很难不接触 Scala . Scala 似乎是为 java 提供了很多『类似函数式编程』的语法糖,这里记录一下这个语言独特的地方分享给读者朋友们. 参考资料主要有: 曹洁 . ...
- OGC标准地图服务协议总结
OGC标准地图服务协议总结 1. WMS WMS(Web Map Service)是OGC(Open Geospatial Consortium)定义的一种地图服务协议.它允许客户端通过HTTP请求从 ...
- JSON和XML的对比及应用领域
JSON和XML的对比 对比表格 对比维度 JSON XML 可读性 通常更简洁,易于阅读和编写12 结构清晰,但可能因标签和属性而显得冗长1 解析难度 解析通常比XML简单,多数现代编程语言内置解析 ...