使用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实现圆缩小放大 (实时刷新窗口)的更多相关文章

  1. websocket实现数据库更新时前端页面实时刷新

    websocket实现数据库更新时前端页面实时刷新 javaweb 目录(?)[+] userjsp ManagerServletjava 如题,实现以上功能,我知道主要有两大种思路: 轮询:轮询的原 ...

  2. 使用SignalR实现比特币价格实时刷新

    ASP.NET SignalR是微软支持的一个运行在 Dot NET 平台上的 HTML Websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重 ...

  3. Sublime Text 3配置LiveReload实现实时刷新

    今天看到一款很强大的插件,LiveReload,实时刷新,也就是说写完html/css/js等不用再到浏览器里按F5啦,在Ctrl+S时浏览器会自动刷新,是不是想想都很爽... Chrome:(据说支 ...

  4. Gulp-livereload:实时刷新编码

    实现功能 监听指定目录下的所有文件,实时动态刷新页面 安装(Install) 功能的实现是借助 gulp-connect 插件完成的;所以,首先通过下面命令完成插件安装: npm install -- ...

  5. tab栏切换,内容为不断实时刷新数据的vue实现方法

    先说一下产品需求,就是有几个tab栏,每个tab栏对应的ajax请求不一样,内容区域一样,内容为实时刷新数据,每3s需要重新请求,返回的数据在内容区域展示,每点击一次tab栏需停止其他tab栏ajax ...

  6. webpack-dev-server 搭建本地服务以及浏览器实时刷新

    一.概述开发项目中为了保证上线,开发项目是都需要使用localhost进行开发,以前的做法就是本地搭建Apache或者Tomcat服务器.有的前端开发人员 对服务器的搭建和配置并不熟悉,这个时候需要后 ...

  7. JAVAFX之tableview界面实时刷新导致的内存溢出(自己挖的坑,爬着也要出来啊0.0)

    这几天遇到了一个问题,不幸开发的一个cs架构的工具,客户端开启后,内存一直在缓慢增长最终导致进程卡死,花了4天时间,终于爬出来了... 客户端通过timer定时器每30秒查询一次数据库以及一些业务逻辑 ...

  8. js获取当前时间并实时刷新

    效果如图: 代码如下: <html> <head> <title>js获取当前时间并实时刷新</title> <script> //页面加载 ...

  9. Vue+WebSocket 实现页面实时刷新长连接

    最近vue项目要做数据实时刷新,折线图每秒重画一次,数据每0.5秒刷新一次,说白了就是实时刷新,因为数据量较大,用定时器估计页面停留一会就会卡死... 与后台人员讨论过后决定使用h5新增的WebSoc ...

  10. echarts背景分割区域填充不同颜色(x轴为time),实时刷新

    先来看下图片吧,这是实现效果: 思路: 因为要实时刷新,可以使用setInterval(),但是要控制好定时器的起与停,否则容易错乱以及页面卡死: 主要就是利用定时器五秒刷新,重绘echarts图:= ...

随机推荐

  1. 【巧用set实现对有序数组O(logn)时间复杂度增、删、查、改、二分操作】codeforces 1041 C. Coffee Break

    题意 第一行输入三个整数 \(n,m,d(1 \leq n \leq 2 * 10^5, n \leq m \leq 10^9, 1 \leq d \leq n)\),第二行输入 \(n\) 个整数, ...

  2. Win10底部任务栏卡死的终极解决方法

    原因:微软自带的资讯和兴趣因国内网络限制,造成失效. 解决方案:底部右键->资讯和兴趣->关闭. 以上仅限WIn10操作系统,win11操作系统以上忽略.

  3. 【Java高级编程】IO流学习笔记

    目录 IO流 File类 文件/文件夹基础操作 创建文件的完整步骤 IO流 - 节点流 读入文件一个字节(一个字节) [FileInputStream]字节数组的方式读取(读取全部内容) [FileI ...

  4. Javadoc 使用详解

    很多程序对Javadoc都不重视,认识不到Javadoc的作用,很多人都是这样认为的:"我只要写好功能就够了,写Javadoc太浪费时间,也没啥作用,还不如用写Javadoc的时间再多些个功 ...

  5. Tesseract开源的OCR工具及python pytesseract安装使用

    一 .介绍 Tesseract是一款由Google赞助的开源OCR. pytesseract是python包装器,它为可执行文件提供了pythonic API. Tesseract 已经有 30 年历 ...

  6. Qt音视频开发20-vlc内核动态保存录像文件(不需要重新编译源码)

    一.前言 在vlc默认提供的保存文件方式中,通过打开的时候传入指定的参数来保存文件,直到关闭播放生成文件,这种方式简单暴力,但是不适用大部分的场景,大部分时候需要的是提供开始录制和停止录制的功能,也就 ...

  7. Qt编写地图综合应用24-miniblink内核

    一.前言 用Qt做项目过程中,遇到需要用到浏览器控件的项目,可能都会绕不开一个问题,那就是从Qt5.6版本开始mingw编译器的Qt构建套件,不再提供浏览器控件了,之前还可以用webkit控件,这下很 ...

  8. 你的语言模型实际是一个奖励模型!😁Direct Preference Optimization:Your Language Model🎭is Secretly a Reward Model

    直接偏好优化:你的语言模型实际上是一个奖励模型 其实每张PPT图下面还有解释的注释,但放上去还要改格式,太多啦!所以就靠大家读论文脑补啦! 摘要 1.引言 2.相关工作 3.预备知识 4.直接偏好优化 ...

  9. Slate文档编辑器-Decorator装饰器渲染调度

    Slate文档编辑器-Decorator装饰器渲染调度 在之前我们聊到了基于文档编辑器的数据结构设计,聊了聊基于slate实现的文档编辑器类型系统,那么当前我们来研究一下slate编辑器中的装饰器实现 ...

  10. HashMap源码解析-JDK18

    引言 HashMap在JDK1.8和1.7中差异较大,在JDK1.8中HashMap引入了红黑树,优化减少了哈希冲突,提高了哈希表的存取效率. 本篇文章分析的就是JDK1.8中的HashMap源码. ...