使用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. vscode本地调试gitbook

    1. windows下载安装git 2.安装nodejs 下载安装nvm https://github.com/coreybutler/nvm-windows/releases/download/1. ...

  2. tomcat部署cas6并配置自己的ssl证书

    ​配置并安装tomcat,详见我的文章:windows安装tomcat10 安装必备的软件:(在<windows安装tomcat10>中已详细配置) apache-tomcat-10.1. ...

  3. Winform 使用WebView2 开发现代应用

    使用 WebView2 开发现代应用 WebView2 是 Microsoft 提供的一种嵌入式浏览器控件,基于 Edge (Chromium) 引擎.它允许开发者将现代 Web 技术(如 HTML. ...

  4. 【单片机】初次实验:Keil51的使用

    哔哩哔哩/CSDN/博客园:萌狼蓝天 延时器 delay(int count){ int i,j; for(i=0;i<count;i++){ for(j=0;j<1000;j++); } ...

  5. 【C#】【平时作业】习题-12-事件

    目录 1. 什么是事件? 2. 事件与委托的关系是什么? 3. 事件发生的类(事件发生器)的主要内容与作用? 4. 事件接收处理的类的主要内容与作用? 5. 什么是订阅事件 ? 6. 如何引发事件? ...

  6. 解决SSH免密登录配置成功后不生效问题

    今天配置SSH免密登录时,使用 ssh-keygen 命令成功生成了公钥和私钥,并且也执行了 ssh-copy-id 机器地址 将公钥添加到了服务器的authorized_keys文件中.紧接着用 s ...

  7. 【转载】Apache Doris、DorisDB傻傻分不清。。。

    https://www.sohu.com/a/488816742_827544   相信这两天很多社区小伙伴都看到 StarRocks 所谓"开源"的动态了,开源用户群里有很多小伙 ...

  8. Qt开发经验小技巧186-190

    关于是使用QList还是QVector的问题,一直是众多Qter的选择问题,主要是这两个玩意提供的的接口函数基本一致,比如插入.删除.取值等. 大多数情况下可以用QList.像append.prepe ...

  9. preparation

    课程知识准备 HTML5基础教程 CSS3基础教程 JavaScript基础教程 HTML DOM基础教程 VUE3基础教程 Element Plus OpenLayers vue3-openlaye ...

  10. 开箱你的 AI 语音女友「GitHub 热点速览」

    随着大模型 API 服务的不断丰富,开发者无需再依赖昂贵的硬件,也能轻松开发出拥有强大 AI 能力的应用.这不仅降低了技术门槛,也激发了极客们的创造力. 就比如上周飙升 1.5k Star 的开源项目 ...